如何根据XML子树的内容选择它



我想在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>

相关内容

  • 没有找到相关文章

最新更新