如何根据其内容选择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进行搜索。
我不知道Ruby或Nokogiri,但接下来测试xpath
表达xqilla似乎工作。
//records[data(name) = "Rose"]
输出:
<records>
<name>Rose</name>
<date>12-1-11</date>
</records>
这是一个XPath 2表达式。我不认为Nokogiri支持这一点。 –
你不是一个属性,但在元素上进行选择。这是一个区别。总之,这里的XPath表达式,你可以使用:
//records[name[text()='Rose']]
也可以变得更短:
//records[name='Rose']
或者如果你警惕的空白瞎搞事情了:
//records[name[normalize-space(text()) = 'Rose']]
由于此用户是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'))
+1。比我的答案更适合提问。我不是Ruby和Nokogiri专家,所以我专注于表达。 –
请注明获得。我猜日期... – lucapette
我想这将是一个XPath答案:) – willcodejavaforfood
请不要添加多个问题。创建一个新问题,并引用这个问题。 –