Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 使用Nokogiri获取节点的兄弟节点_Ruby_Nokogiri - Fatal编程技术网

Ruby 使用Nokogiri获取节点的兄弟节点

Ruby 使用Nokogiri获取节点的兄弟节点,ruby,nokogiri,Ruby,Nokogiri,有没有办法在节点中找到一个特定的值,然后返回它的所有同级值 例如,我想查找包含id 5678的id节点,然后获取电子邮件地址和与id 5678关联的所有图像 Nokogiri::XML.parse(File.open('info.xml')) 下面是一个示例XML文件 1234 sdfsdf@sdasd.com 图片/1.jpg 图片/2.jpg 图片/3.jpg 5678 zzzz@zzz.com 图片/4.jpg 图片/5.jpg 9011 aaaa@aaa.com 图片/6.jpg 图

有没有办法在节点中找到一个特定的值,然后返回它的所有同级值

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

Nokogiri::XML.parse(File.open('info.xml'))
下面是一个示例XML文件


1234
sdfsdf@sdasd.com
图片/1.jpg
图片/2.jpg
图片/3.jpg
5678
zzzz@zzz.com
图片/4.jpg
图片/5.jpg
9011
aaaa@aaa.com
图片/6.jpg
图片/7.jpg
更新:有一些更短、甚至更好的方法来获取所需的
详细信息
节点:

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


这些都是pguardiario提供的。

您可以使用
~
,这是css通用同级选择器:

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

将css与xml结合使用有点奇怪,但它比xpath更容易查看。

您可以通过替换
select{}来加强这一点。首先
使用
find{}
,或者您可以使用
doc.at('details:has(id[text()=“5678”]))更直接地访问details节点。
@pgiario搜索文档的方法太多了!谢谢你的提示!不客气!在这种情况下,xpath实际上可能更简单:
doc.at('//id[text()=“5678”]/..)
确实有用。“.”包含在FacePalm中非常好的语法
'id[text()=“5678”]~*'
。第一次我基本上找到了
XPATH
部分,比如
[text()=“5678”]
。你在哪里见过这样的把戏?:)如果可能,请解释搜索表达式的用法。
[text()=“5678”]
不是标准css,但nokogiri允许。剩下的只是css
~*
表示任何兄弟元素+1“将css与xml结合使用有点奇怪,但它比xpath更容易查看。”我同意,我很高兴Nokogiri给了我们这个选项。CSS通常更具可读性。“text()=“5678”]不是标准CSS,但nokogiri允许。”我没有检查,但我怀疑它是从nokogiri的jQuery CSS访问器实现中引入的CSS扩展。实际上,jQuery有一个名为contains的函数,但无法轻松匹配精确文本。
details = doc.search('id[text()="5678"] ~ *')
doc.search('id[text()="5678"] ~ *').map &:text
#=> ["zzzz@zzz.com", "images/4.jpg", "images/5.jpg"]