2012-04-23 712 views
2

我在PostgreSQL 9.1.3表中有一堆XML消息,其中有一個類型爲XML的列content)。他們不都是一樣的「類型」,所以我想用這樣的查詢,提取根型:在PostgreSQL中使用XPath選擇根元素的名稱

SELECT xpath('name(/*)', content) FROM message; 

所推薦的this answer了類似SO問題。

樣本消息是:

<?xml version="1.0" encoding="UTF-8"?> 
<WML version="6" xmlns="http://example.com/schemas/WML">...</WML> 

對於這種情況下,我希望得到的結果 '{WML}'。不幸的是,它只是返回一個空數組。將namespaces參數添加到xpath或從消息中刪除名稱空間不起作用。

關於PostgreSQL郵件列表的討論似乎在PostgreSQL的XPath處理中有explain it as a bug。然而,這是在2008年,看看PostgreSQL的源代碼在2009年顯示了一段代碼was changed。我不是PostgreSQL開發人員,所以我不確定這個bug是否是我的情況中的一個因素。

但我想知道是否有解決方法,例如可能工作的替代XPath表達式?我不想訴諸正則表達式來解析XML,但如果你可以建議一個簡短的,強大的,強大的RE,那麼它會比沒有好。

回答

0

我不知道老版本的解決方法,但是這在PostgreSQL 9.2中得到了修復,所以這很好。

(最有可能的解決方法很可能是編寫一個函數來手動解析XML,但我很高興我現在不必訴諸於此!)