2011-05-24 57 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