在PostgreSQL中使用XPath选择根元素的名称

时间:2012-04-23 23:32:31

标签: postgresql xpath document-root

我在PostgreSQL 9.1.3表中有一堆XML消息,其中列content的类型为XML)。它们不是完全相同的“类型”,所以我试图使用这样的查询提取根类型:

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的XPath处理中,对PostgreSQL邮件列表的讨论似乎explain it as a bug。然而那是在2008年,看看PostgreSQL源代码在2009年显示了这段代码was changed。我不是PostgreSQL开发人员,所以我不相信这个bug是或不是我的一个因素情况下。

但是我想知道是否有解决方法,例如可能有效的替代XPath表达式?我宁愿不必使用正则表达式来解析XML,但是如果你能建议一个简短,有力,可靠的RE,那么它总比没有好。

2 个答案:

答案 0 :(得分:0)

显然,截至2011年6月尚未解决 我发现this thread on pgsql-hackers完全描述了您的问题。

答案 1 :(得分:0)

我不知道旧版本的解决方法,但这在PostgreSQL 9.2中得到修复,因此非常棒。

(最有可能的解决方法可能是编写一个手动解析XML的函数,但我很高兴我现在不必诉诸于此!)