PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Extrahieren mehrerer Ebenen von XML-Daten mit xpath in Postgres

Ich weiß zu schätzen, dass diese Frage ein paar Jahre alt ist, aber ich bin mit einem ähnlichen Problem hierher gekommen und glaube, ich habe eine Antwort gefunden.

with x as (select
'<catalog catalog-id="manufacturer-catalog-id">
    <category-assignment category-id="category1" product-id="product1"/>
    <category-assignment category-id="category1" product-id="product2"/>
    <category-assignment category-id="category2" product-id="product3"/>
</catalog>'::xml as t
)
(
select 
       xpath('/catalog/@catalog-id', cat_node) catalog_id,
       xpath('/category-assignment/@category-id', cat_assn_list) category_id,
       xpath('/category-assignment/@product-id', cat_assn_list) product_id         
 from (select unnest(xpath('/catalog/category-assignment', t)) cat_assn_list, t cat_node from x) q
);

Dies ergibt

        catalog_id         | category_id | product_id
---------------------------+-------------+------------
 {manufacturer-catalog-id} | {category1} | {product1}
 {manufacturer-catalog-id} | {category1} | {product2}
 {manufacturer-catalog-id} | {category2} | {product3}
(3 rows)

Dies führt im Wesentlichen die Basisauswahl aus, die zwei Spalten zurückgibt:1) den xpath zum Abrufen der Zuweisungsliste (mehrere Zeilen) und 2) den ursprünglichen Kategorieknoten. Die zurückgegebenen Zeilen werden dann von den xpath-Anweisungen auf höherer Ebene bearbeitet - die Kategorie-ID aus der Spalte des vollständigen Kategorieknotens und die xpaths auf Spaltenebene in das Zuweisungslistenelement.

Ich glaube, das Problem des OP war, dass das reine Austreiben aus der Spalte der Einzelzuweisungsliste bedeutet, dass, da Postgres XML-Knotensätze auf der entsprechenden Ebene zurückgibt, und nicht Zeiger auf einen einzelnen Dom, die von diesem zurückgegebene XML-Ausgabe unterhalb der Katalogebene liegt und dass xml ndoeset nicht nach oben durchlaufen werden kann, z. mit "Vorfahr::".

Hoffe, das hilft jemand anderem.

Bearbeiten - Ich kann die Leistung nicht kommentieren, da ich glaube, dass der Xpath der Katalog-ID für jede Zuweisungszeile innerhalb desselben Katalogknotens wiederholt wird.