sql >> Database >  >> RDS >> PostgreSQL

xpath gebruiken om gegevens uit een XML-kolom in postgres te extraheren

Dit werkt:

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;

Retourneren:

{"2013 1st Semester Jet Giveaways"}

Merk op hoe ik de naamruimte-alias . toewijs n voor uw naamruimte in het derde argument van xpath() en gebruik het op elk niveau van het xpath.

Als u de XML-naamruimte uit het document verwijdert, wordt alles veel eenvoudiger:

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;

<rant> Ligt het aan mij of is iedereen blij met json en jsonb , zodat we niet met XML te maken hebben.</rant>




  1. Wat hebben poker, blackjack, Belot en Préférence met databases te maken?

  2. c# select-query naar Oracle-database gooit Custom type mapping voor ... is niet gespecificeerd of is ongeldig

  3. mysql_fetch_assoc() fout wanneer gegevens in mysql-veld worden gewijzigd

  4. Meerdere rijen verwijderen met ID's?