首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nokogiri和concat()

Nokogiri和concat()
EN

Stack Overflow用户
提问于 2016-12-26 23:29:24
回答 2查看 741关注 0票数 3

如何在Nokogiri xpath表达式中使用concat()?我试过:

代码语言:javascript
复制
xml.xpath("concat(/root/a/text(), /root/b/text())")

但以下情况却未能实现:

ArgumentError: node_set必须是Nokogiri::XML::NodeSet

实际上,似乎Nokogiri只接受以“”开头的xpath表达式。或者"/",所以我试了一下:

代码语言:javascript
复制
xml.xpath(".concat(/root/a/text(), /root/b/text())")
xml.xpath("/concat(/root/a/text(), /root/b/text())")
xml.xpath("/concat('foo', 'bar')")

但是他们都失败了,因为这个错误:

Nokogiri::XML::XPath::SyntaxError:无效表达式: /concat('foo','bar')

我知道Nokogiri是基于libxml2的,因此它只实现了XPath 1.0。但是concat()是XPath 1.0的一部分。然而,在XPath 2.0中有一个类似的函数是string(),我给了它一个机会:

代码语言:javascript
复制
xml.xpath("string-join('foo', 'bar')")     

错误消息:

RuntimeError: xmlXPathCompOpEval:函数字符串-未找到连接

看,这是一条与concat()不同的错误消息。因此,至少可以找到函数concat()。另一个暗示它可能会起作用的是..。

代码语言:javascript
复制
xml.xpath("concat()")                                                           

...returns预期的错误消息:

Nokogiri::XML::XPath::SyntaxError:无效的参数数: concat()

有机会和争论打交道吗?

P.S.:像xml.xpath("/root/a/text()")这样的基本xpath表达式工作得很好。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-27 18:07:54

XPath查询通常返回节点集,即文档中节点的集合。在Nokogiri中,这由Nokogiri::XML::NodeSet对象表示。

Nokogiri还允许您使用NodeSetxpath方法。在本例中,Nokogiri 它作为结果返回

通常,这与您所期望的一样工作,其结果是匹配查询的所有节点的组合。但是,当使用返回节点集以外的内容的XPath查询时,这是行不通的,如本例所示。

执行查询后,Nokogiri尝试将结果(它希望是NodeSet)添加到新创建的NodeSet中。当结果实际上是字符串这与您正在获得的错误一起失败。时。

这已经在诺科吉里虫中提到,并添加到他们的路线图中,但是到目前为止还没有解决方案。

解决方法/解决方案是让所有非节点集在单个节点上返回XPath查询,而不是节点集。at_xpath将返回查询的第一个匹配节点,该节点可以用于进一步的xpath调用,而不会出现此问题。

票数 2
EN

Stack Overflow用户

发布于 2016-12-26 23:38:28

好像是为我工作

代码语言:javascript
复制
body = "<root><a>aaa</a><b>bbb</b></root>"
xml = Nokogiri::XML(body)
xml.xpath("concat(/root/a/text(), /root/b/text())") # => "aaabbb"

考虑到你的最新情况,不妨试试这个?

代码语言:javascript
复制
body = "<wrapper><root><a>aaa</a><b>bbb</b></root></wrapper>"
xml = Nokogiri::XML(body) 
xml = xml.xpath("wrapper") # returns a node set
xml.map { |each| each.xpath("concat(./root/a/text(), ./root/b/text())") } # => ["aaabbb"]

注意,注意前面的.将查询锚定在当前节点上。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41337274

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档