2017-09-11 8 views
2

XPATHを使用したPostgreSQLでのXML文書の解析?

として所望の出力を得るためにXPathを使用してPostgreSQLの次のXML文書を解析する方法--Corrected price素子に要求される出力

promotion-id price new-promotion null new-promotion null new-promotion 300

があります。現在、以下に示すクエリを実行すると、出力として300が取得されます。私の問題は、クエリは、<price xsi:nil="true"/>構造を持つ価格要素を無視しています。

<price xsi:nil="true"/>型構造の価格要素の結果としてnullを返す方法はありますか?上記の問題のための任意の提案が高く評価されて

WITH x AS (SELECT 
'<promotions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <promotion promotion-id="old-promotion"> 
     <enabled-flag>true</enabled-flag> 
     <searchable-flag>false</searchable-flag> 
    </promotion> 
    <promotion promotion-id="new-promotion"> 
     <enabled-flag>false</enabled-flag> 
     <searchable-flag>false</searchable-flag> 
     <exclusivity>no</exclusivity> 
     <price xsi:nil="true"/> 
     <price xsi:nil="true"/> 
     <price>300</price> 
    </promotion> 
</promotions>'::xml AS t 
) 
SELECT unnest(xpath('//price/text()', node))::text 
FROM (SELECT unnest(xpath('/promotions/promotion', t)) AS node FROM x) sub 

私のコードは次のようなものです。

答えて

1

問題は、最初の2つのprice要素から抽出されるテキストがないことです。 See discussion. Postgresqlは現在XPath 1.0に制限されていますので、XMLフラグメントをネスト解除して個別にテキストに変換する必要があります。

WITH x AS (SELECT 
'<promotions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <promotion promotion-id="old-promotion"> 
     <enabled-flag>true</enabled-flag> 
     <searchable-flag>false</searchable-flag> 
    </promotion> 
    <promotion promotion-id="new-promotion"> 
     <enabled-flag>false</enabled-flag> 
     <searchable-flag>false</searchable-flag> 
     <exclusivity>no</exclusivity> 
     <price xsi:nil="true"/> 
     <price xsi:nil="true"/> 
     <price>300</price> 
    </promotion> 
</promotions>'::xml AS t 
) 
SELECT (xpath('@promotion-id',node))[1]::text AS "promotion-id", 
     (xpath('/price/text()', 
       unnest(xpath('price',node)) 
     ))[1]::text AS price 
    FROM (SELECT unnest(xpath('/promotions/promotion', t)) AS node FROM x) sub 
+0

メッセージありがとうございました。提案された解決策は機能しましたが、望ましい出力にはpormotion-id要素への参照が必要です。更新されたメッセージをご覧ください。あなたの助けに感謝。 –

関連する問題