2011-05-24 30 views
1

之一。例如让XML类的,我有这个XML对象:引入nokogiri:如何通过其子标签的内容

<PARENT> 
    <ROW> 
    <ID>1</ID> 
    <INFO>1234</INFO> 
    </ROW> 
    <ROW> 
    <ID>2</ID> 
    <INFO>4321</INFO> 
    </ROW> 
    <ROW> 
    <ID>3</ID> 
    <INFO>4444</INFO> 
    </ROW> 
</PARENT> 

在一个叫rows变量。

xml = Nokogiri::XML(rows) 

我需要的是通过ID标签内部的ID检索整个ROW子标签。

回答

3
s = <<-EOS 
<PARENT> 
    <ROW> 
    <ID>1</ID> 
    <INFO>1234</INFO> 
    </ROW> 
    <ROW> 
    <ID>2</ID> 
    <INFO>4321</INFO> 
    </ROW> 
    <ROW> 
    <ID>3</ID> 
    <INFO>4444</INFO> 
    </ROW> 
</PARENT> 
EOS 

doc = Nokogiri::XML(s) 
element = doc.xpath("//ROW[ID='2']") 
p element.to_s 
# => "<ROW>\n <ID>2</ID>\n <INFO>4321</INFO>\n </ROW>" 

如果你想要的结果细化到一个特定的节点,将其添加到最后。

s = <<-EOS 
<PARENT> 
    <ROW> 
    <ID>1</ID> 
    <INFO>1234</INFO> 
    </ROW> 
    <ROW> 
    <ID>2</ID> 
    <INFO>4321</INFO> 
    </ROW> 
    <ROW> 
    <ID>3</ID> 
    <INFO>4444</INFO> 
    </ROW> 
</PARENT> 
EOS 

doc = Nokogiri::XML(s) 
element = doc.xpath("//ROW[ID='2']/INFO") 
p element.to_s 
# => "<INFO>4321</INFO>" 
+0

谢谢,我修正了这个例子。 – 2011-05-24 15:07:57

3

XPath允许你这样做:

xml.xpath '//PARENT/ROW/ID[text="3"]/..' 
+0

非常感谢这个信息,兄弟 – 2011-05-24 10:46:18

2

你可以得到整行是这样的:

>> xml.xpath("//ROW[ID=3]").each { |el| p el } #=> 0 
#<Nokogiri::XML::Element:0x809ba610 name="ROW" children=[#<Nokogiri::XML::Text:0x809ba318 "\n ">, #<Nokogiri::XML::Element:0x809ba2c8 name="ID" children=[#<Nokogiri::XML::Text:0x809b9fd0 "3">]>, #<Nokogiri::XML::Text:0x809b9e54 "\n ">, #<Nokogiri::XML::Element:0x809b9e04 name="INFO" children=[#<Nokogiri::XML::Text:0x809b9ad0 "4444">]>, #<Nokogiri::XML::Text:0x809b9968 "\n ">]> 
+0

^_ ^对我在文字方面的错误感到抱歉。 – 2011-05-24 10:44:44

+0

谢谢你的回答 – 2011-05-24 10:45:43

+1

@AutoCoder:在StackOverflow上很好的做法是提供有用的答案并接受它们(小数点左边的记号)。 – 2011-05-24 11:31:35