我希望在XML树中搜索特定属性,然后我想要提取包含该属性的树的一部分。
示例:
<records>
<name>Rose</name>
<date>12-1-11</date>
</records>
<records>
<name>jon</name>
<date>12-1-11</date>
</records>
<records>
<name>Tom</name>
<date>12-1-11</date>
</records>
我想搜索“Rose”并获取整个<records>
元素及其子元素。
谢谢大家,你很快。
我还有另一个问题,如果我有更多的节点,而且它们不是记录,我怎样才能搜索所有节点?
<records>
<name>Rose</name>
<date>12-1-11</date>
</records>
<cars>
<name>jon</name>
<date>12-1-11</date>
</cars>
<houses>
<name>Tom</name>
<date>12-1-11</date>
</houses>
这次我将按日期= 11-1-11进行搜索。
答案 0 :(得分:4)
您不是在属性上选择,而是在元素上选择。这是一个区别。无论如何,这里有你可以使用的XPath表达式:
//records[name[text()='Rose']]
也可缩短:
//records[name='Rose']
或者,如果你对白色空间搞砸了,请注意:
//records[name[normalize-space(text()) = 'Rose']]
答案 1 :(得分:2)
基于XPath的answer by @G_H是我个人使用的。但是,为了完整起见,这里是你如何使用CSS选择器语法和更多Ruby来在Nokogiri中执行此操作:
names = doc.css('name')
rose = names.find{ |el| el.text == "Rose" }
rose_record = rose.parent
或单行:
rec = doc.css('name').find{ |el| el.text=="Rose" }.parent
有关详细信息,请参阅Enumerable#find
文档。
修改:由于您是Nokogiri的新手,以下是创建文档以开始查询的方法:
require 'nokogiri' # gem install nokogiri
doc = Nokogiri.XML(File.read('my.xml'))
答案 2 :(得分:-1)
我不知道Ruby或Nokogiri但是在xqilla中测试了下一个xpath
表达式并且似乎有效。
//records[data(name) = "Rose"]
输出:
<records>
<name>Rose</name>
<date>12-1-11</date>
</records>