【问题标题】:XPath1 at SQL/XML, count elements returns emptySQL/XML 中的 XPath1,计数元素返回空
【发布时间】:2013-03-09 10:53:35
【问题描述】:

我正在使用PostgreSQL 9,它采用XPath-1 表示SQL/XML standard cumpliance。

这个查询没问题,返回预期的数据:

 SELECT xpath('//img',xhtm) FROM t

但是另一个,计算img元素,返回空(!),

 SELECT xpath('count(//img)',xhtm) FROM t

注意 1:xhtm 字段内容示例,

 <html><p>Hello! <img src="1.png"/></p><img src="2.jpg"/></html>

注意 2:当然array_length(xpath('//img',xhtm),1) 显示计数结果,但它不是 XPath 计数。

注意 3:我不知道这是一个通用的 SQL/XML 特性,还是 PosgreSQL Server 9.0.5 特定的错误/问题。

【问题讨论】:

  • 您能向我们展示您的 XML 内容吗?

标签: postgresql xpath count sqlxml


【解决方案1】:

编辑: 正如我在下面的 cmets 中所指出的,以及 this SO Answer 中所指出的,这个问题显然在 Postgresql 9.2 中得到了解决。该答案指出:

在 PostgreSQL 9.2 的文档中突然多了一句涵盖 xpath 函数:

如果 XPath 表达式返回标量值而不是节点集,则返回单元素数组。

正是我需要的!所以关于这个问题,另一个有效的答案是:升级到 PostgreSQL 9.2。

以下是我原始答案的其余部分:

这似乎是 Postgresql 的 xpath() 函数中的一个已知限制 - 只有计算为节点集的表达式才会返回任何内容;返回标量值的 XPath 表达式只返回一个空数组。

一些 Google 搜索显示大约 2 年前对此的一些讨论,主要来自一个名叫 Florian Pflug 的人:

http://postgresql.1045698.n5.nabble.com/PATCH-Bug-in-XPATH-if-expression-returns-a-scalar-value-td4440233.html


他开发了一个补丁,据说可以解决这个问题,并附加到以下线程(尽管我不完全确定这是最新版本):

http://www.postgresql.org/message-id/FC60A4F5-5560-438C-97E8-B6D1FDE1CC2B@phlo.org


似乎确实有一些关于他的补丁的优缺点的讨论,所以我建议通读这些帖子以了解所涉及的内容:

http://www.postgresql.org/message-id/201106291957.04251.rsmogura@softperience.eu http://www.postgresql.org/message-id/201106291934.23089.rsmogura@softperience.eu

【讨论】:

  • 哼...好吧,一个 PostgreSQL BUG... 没有 2013 年的解决方案??
  • 经过更多挖掘this SO answer 似乎表明该限制已在 9.2 中得到纠正(尽管海报使用的示例实际上并未验证这一点,奇怪的是)。
  • 是的,非常感谢。我按照您的提示(SO 答案)并要求@yankee 测试一个标量案例......所以,这是 Yankee 的测试结果!现在我真的相信 pg9.2 是我的解决方案 ;-)
  • 问题:你(JLRishe)做“挖掘工作”,但洋基在答案正文中展示了解决方案......我会投票给两者......但赏金归谁? (检查规则并等待其他人的投票)。
  • 好吧,从技术上讲,我确实在 cmets 中提供了答案,只是还没有将其添加到我的答案正文中。我现在已经修改了。当然,由你来选择获胜者,但如果你不这样做,并且没有人投票,我们都不会得到赏金。如果票数多,那么得票最多的人将获得一半的赏金。
【解决方案2】:

JLRishe 让我知道了您的问题。去年五月我遇到了同样的问题,我发现问题在 PostgreSQL 9.2 中得到了修复。

从 9.2 版开始。文档指出:

如果 XPath 表达式返回标量值而不是节点集, 返回一个单元素数组。

我刚刚下载了 PostgreSQL 9.2 并运行了您的示例:

postgres=# select version();   
                                                    version                                                    
---------------------------------------------------------------------------------------------------------------
 PostgreSQL 9.2.3 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-52), 64-bit
(1 row)

postgres=# SELECT xpath('count(//img)','<html><p>Hello! <img src="1.png"/></p><img src="2.jpg"/></html>'::xml);
 xpath 
-------
 {2}
(1 row)

【讨论】:

  • 非常感谢,现在我们有一个可靠的证据证明 pg9.2 有效(!),另一个见证 pg9.1、pg9.0 和 pg.8.X 有一个 BUG.. . 好吧,我需要请求我的托管服务来升级 pg9.1。
猜你喜欢
  • 1970-01-01
  • 2021-09-08
  • 2012-10-06
  • 2018-02-15
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多