2017-09-11 175 views
2

有一種方法來解析使用XPATH,以獲得期望的輸出PostgreSQL中下面的XML文檔作爲解析XML文檔使用XPATH?

--Corrected爲price元件所需的輸出

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

。目前,當我運行下面提供的查詢,我得到300作爲輸出。我的問題是我的查詢忽略其<price xsi:nil="true"/>結構中的價格因素。

有沒有辦法將null作爲<price xsi:nil="true"/>類型結構的價格元素的結果?

我的代碼是這樣的:

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個價元素提取的文本。 See discussion. PostgreSQL是目前僅限於XPath 1.0所以我們需要UNNEST的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元素。請參閱更新的消息。感謝你的幫助。 –