我想在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进行搜索
选择的不是属性而是元素。这是一个区别。无论如何,这里是您可以使用的XPath表达式:
//records[name[text()='Rose']]
也可以更短:
//records[name='Rose']
或者如果你担心留白会把东西弄乱:
//records[name[normalize-space(text()) = 'Rose']]
@G_H基于xpath的答案是我个人会使用的。但是,为了完整起见,下面是在Nokogiri中使用CSS选择器语法和多一点Ruby的方法:
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'))
我不知道Ruby或Nokogiri,但在xqilla中测试了下一个xpath
表达,似乎有效。
//records[data(name) = "Rose"]
输出:<records>
<name>Rose</name>
<date>12-1-11</date>
</records>