2

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

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

正如this answer to a similar SO question所建议的那样。

示例消息是:

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

对于这种情况,我希望得到结果“{WML}”。不幸的是,它只返回一个空数组。将命名空间参数添加到xpath消息中或从消息中删除命名空间都没有帮助。

关于 PostgreSQL 邮件列表的讨论似乎将其解释为PostgreSQL 中 XPath 处理中的一个错误。然而那是在 2008 年,查看 PostgreSQL 源代码显示,这段代码在 2009年发生了变化。我不是 PostgreSQL 开发人员,所以我不确定这个错误是不是我的情况的一个因素。

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

4

2 回答 2

0

显然,截至 2011 年 6 月,这尚未解决。
我发现这个线程pgsql-hackers准确地描述了您的问题。

于 2012-04-24T02:00:27.460 回答
0

我不知道旧版本的解决方法,但这在 PostgreSQL 9.2 中已修复,所以很好。

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

于 2012-09-13T23:29:02.293 回答