Nokogiri: Как получить класс XML по одному из его содержимого - PullRequest
1 голос
/ 24 мая 2011

Например, у меня есть этот объект XML:

<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)

То, что мне нужно, - это получить весь поиск подтега ROW по ID внутри тега ID.

Ответы [ 3 ]

3 голосов
/ 24 мая 2011
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>"
3 голосов
/ 24 мая 2011

XPath позволяет вам сделать это:

xml.xpath '//PARENT/ROW/ID[text="3"]/..'
2 голосов
/ 24 мая 2011

Вы можете получить всю строку следующим образом:

>> 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  ">]>
...