PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Използване на xpath за извличане на данни от XML колона в postgres

Това работи:

WITH tbl(p_xml) AS (  -- CTE just to provide test table with xml value
   SELECT '<promotions xmlns="http://www.demandware.com/xml/impex/promotion/2008-01-31">
              <campaign campaign-id="2013-1st-semester-jet-giveaways">
                 <description>2013 1st Semester Jet Giveaways</description>
                 <enabled-flag>true</enabled-flag>
                 <start-date>2013-01-01T05:00:00.000Z</start-date>
                 <end-date>2013-07-01T04:00:00.000Z</end-date>
                 <customer-groups>
                    <customer-group group-id="Everyone"/>
                 </customer-groups>
              </campaign>
           </promotions>'::xml
    )  -- end of CTE, the rest is the solution
SELECT xpath('/n:promotions/n:campaign/n:description/text()', p_xml
           , '{{n,http://www.demandware.com/xml/impex/promotion/2008-01-31}}')
FROM   tbl;

Връща:

{"2013 1st Semester Jet Giveaways"}

Обърнете внимание как присвоявам псевдонима на пространството от имена n за вашето пространство от имена в третия аргумент на xpath() и го използвайте на всяко ниво на xpath.

Ако премахнете XML пространството от имена от документа, всичко става много по-просто:

WITH tbl(p_xml) AS (  -- not the missing namespace below
   SELECT '<promotions>
              <campaign campaign-id="2013-1st-semester-jet-giveaways">
                 <description>2013 1st Semester Jet Giveaways</description>
                 <enabled-flag>true</enabled-flag>
                 <start-date>2013-01-01T05:00:00.000Z</start-date>
                 <end-date>2013-07-01T04:00:00.000Z</end-date>
                 <customer-groups>
                    <customer-group group-id="Everyone"/>
                 </customer-groups>
              </campaign>
           </promotions>'::xml
   )
SELECT xpath('/promotions/campaign/description/text()', p_xml)
FROM   tbl;

Само аз ли съм, или всички са доволни от json и jsonb , така че не трябва да се занимаваме с XML.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Оптимизиране на скоростта на базата данни:няколко таблици с много редове или много таблици с малко редове?

  2. не може да рестартира postgre на mac os x

  3. Как да създадете индекс на LOWER(users.username) в Rails (с помощта на postgres)

  4. Търсене на jsonb масив в PostgreSQL

  5. Проверете дали съществува асоциация, без да предизвикате попадение в базата данни