2014-09-04 67 views
2
取下的XPath輸出大括號

比方說,我解析使用此Postgres裏

SELECT xpath('/id/text()', '<id>45687</id>'::xml); 

和一個XML輸出將

xpath 
------- 
{45687} 

我怎麼把它輸出,無需大括號高效?並通過有效的,我的意思是不必使用REGEXP_REPLACE()函數一樣

SELECT regexp_replace(xpath('/id/text()', '<id>45687</id>'::xml)::text, '[{}]', '', 'g'); 

回答

5

xpath()不返回一個字符串,它返回一個xml[]。花括號是數組符號的一部分,而不是數據的一部分 - 你用text轉換自己添加它們。

對於一個固定大小的數組,你可以通過索引拉元素出來:

SELECT (xpath('/id/text()', '<id>45687</id>'::xml))[1] 

要概括這對元素的任意號碼,你可以做這樣的事情:

SELECT string_agg(x::text, ',') 
FROM unnest(xpath('/id/text()', '<id>45687</id>'::xml)) u(x) 

雖然這可能不會比你的原始版本更有效率。通過字符串操作完成此操作的最簡單方法可能是

SELECT btrim(xpath('/id/text()', '<id>45687</id>'::xml)::text, '{}') 
+0

哇,謝謝你的多種替代方法來做到這一點。 – cYn 2014-09-04 22:50:06

1

我想我發現了什麼似乎是一個更好的辦法。由於xpath返回Postgres中的數組結果,我只是將xpath輸出結果映射到數組,並使用unnest來提取該值。 xpath使用大括號輸出值是有意義的,因爲可能有很多我從中提取的元素實例。因此,另一種方式來做到這將是

SELECT unnest(xpath('/id/text()', '<id>45687</id>'::xml)::varchar[]);