gpt4 book ai didi

xml - Postgresql 9.2 xml命名空间前缀错误

转载 作者:行者123 更新时间:2023-11-29 12:22:19 25 4
gpt4 key购买 nike

在 PostgreSQL 9.1 上,我可以毫无错误地执行这两个查询,并得到正确的结果:

SELECT xpath('/a', '<a s:dd="11"><c>test</c></a>')
SELECT xpath('/a', '<a s:dd="11"><c>test</c></a>',ARRAY[ARRAY['s', 'http://example.com']])

在 PostgreSQL 9.2 上相同的查询会抛出错误:

ERROR:  could not parse XML document
DETAIL: line 1: Namespace prefix s for dd on a is not defined

只有这个查询工作正常:

SELECT xpath('/a', '<a xmlns:s="ddd" s:dd="11"><c>test</c></a>')

我如何解析 XML 文件,而不是修改 XML 代码?

当我想对 xml 元素进行 xpath 查询时,问题开始了,从以前的查询中获得。

例如xml文件:

 <some xmlns:my="somens">
<a>
<b my:param="11" />
</a>
</some>

我想做这样的事情:

 elem = xpath('/a',doc);
elem2= xpath('//b',elem[0]);

第二行抛出错误,因为未知前缀 my。有什么想法吗?

最佳答案

除了 PostgreSQL 破坏性功能之外,我没有看到您遇到的问题。在第一个文档中

这是严格的 XML 解析器的预期行为。 PostgreSQL 改变行为的事实很糟糕,但我想这是我们必须处理的事情。

这个

SELECT xpath('/a', '<a s:dd="11"><c>test</c></a>')

失败,因为 s 命名空间未在 XML 文档中声明。这有效:

# SELECT xpath('/a', '<a xmlns:s="http://example.com" s:dd="11"><c>..</c></a>');
xpath
--------------------------------------------------
{"<a xmlns:s=\"http://example.com\" s:dd=\"11\">+
<c>..</c> +
</a>"}
(1 row)

你在这里做什么:

SELECT xpath('/a', '<a xmlns:s="http://example.com" s:dd="11"><c>..</c></a>',
ARRAY[ARRAY['s', 'http://example.com']]);

是将 s 命名空间绑定(bind)到 http://example.com,使您能够在该命名空间中运行 xpath 表达式。观察:

这是原始查询,但 a 标记位于 http://example.com 命名空间中。您的查询 (/a) 与任何文档都不匹配,因为您正在查询默认命名空间中的 a 元素:

# SELECT xpath('/a', '<s:a xmlns:s="http://example.com" s:dd="11"><c>test</c></s:a>');
xpath
-------
{}
(1 row)

然而,这会选择根元素:

# SELECT xpath('/x:a', '<s:a xmlns:s="http://example.com" s:dd="11"><c>..</c></s:a>',
ARRAY[ARRAY['x', 'http://example.com']]);
xpath
----------------------------------------------------
{"<s:a xmlns:s=\"http://example.com\" s:dd=\"11\">+
<c>test</c> +
</s:a>"}
(1 row)

注意 sx 是如何绑定(bind)到同一个命名空间 http://example.com 的。使用不同的 namespace 绑定(bind)令人困惑,但我只想向您展示它是如何工作的。

关于xml - Postgresql 9.2 xml命名空间前缀错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14042724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com