如何根据其内容选择XML子树?

时间:2011-12-01 15:53:57

标签: ruby xml xpath nokogiri

我希望在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进行搜索。

3 个答案:

答案 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>