用Nokogiri获取节点的兄弟姐妹

有没有办法在节点中找到特定值然后返回其所有兄弟值?

例如,我想找到包含ID 5678的id节点,然后获取电子邮件地址和与ID 5678相关的所有图像。

 Nokogiri::XML.parse(File.open('info.xml')) 

这是一个示例XML文件。

  
1234 sdfsdf@sdasd.com images/1.jpg images/2.jpg images/3.jpg
5678 zzzz@zzz.com images/4.jpg images/5.jpg
9011 aaaa@aaa.com images/6.jpg images/7.jpg

 require 'nokogiri' doc = Nokogiri::XML.parse(File.open('info.xml')) details = doc.css('details').find{|node| node.css('id').text == "5678"} email = details.css('email').text # => "zzzz@zzz.com" images = details.css('image').map(&:text) # => ["images/4.jpg", "images/5.jpg"] 

更新:有更短的,可以说更好的方法来获取所需的details节点:

 details = doc.at('details:has(id[text()="5678"])') 

要么

 details = doc.search('id[text()="5678"] ~ *') 

这些都是pguardiario的礼貌。

你可以使用~ ,这是css通用兄弟选择器:

 doc.search('id[text()="5678"] ~ *').map &:text #=> ["zzzz@zzz.com", "images/4.jpg", "images/5.jpg"] 

使用带有xml的css有点奇怪,但它比查看更容易(比xpath)。