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

问题描述:

我想要搜索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> 

我想搜索“玫瑰”,并得到整个<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进行搜索。

+2

请注明获得。我猜日期... – lucapette

+0

我想这将是一个XPath答案:) – willcodejavaforfood

+0

请不要添加多个问题。创建一个新问题,并引用这个问题。 –

我不知道Ruby或Nokogiri,但接下来测试xpath表达xqilla似乎工作。

//records[data(name) = "Rose"] 

输出:

<records> 
    <name>Rose</name> 
    <date>12-1-11</date> 
</records> 
+1

这是一个XPath 2表达式。我不认为Nokogiri支持这一点。 –

你不是一个属性,但在元素上进行选择。这是一个区别。总之,这里的XPath表达式,你可以使用:

//records[name[text()='Rose']] 

也可以变得更短:

//records[name='Rose'] 

或者如果你警惕的空白瞎搞事情了:

//records[name[normalize-space(text()) = 'Rose']] 
+0

由于此用户是Nokogiri的新用户,因此您可能会包括如何使用XPath来查找元素,即'doc = Nokogiri.XML(IO.read('my.xml')); record = doc.at_xpath(“// records [name ='Rose']”)';此外,由于您显示了一个'较短',所以您可能还会包含'//记录[normalize-space(name)='Rose']' – Phrogz

基于XPath的answer by @G_H是我个人使用的。然而,为了完整性,这里是你如何可以在引入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')) 
+0

+1。比我的答案更适合提问。我不是Ruby和Nokogiri专家,所以我专注于表达。 –