Nokogiri: как получить xml-класс по содержимому одного из его подтегов

#ruby #xml #search #xpath #nokogiri

#ruby #xml #Поиск #xpath #nokogiri

Вопрос:

Например, у меня есть этот 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)
  

Что мне нужно, так это получить подтег всей СТРОКИ при поиске по идентификатору внутри тега ID.

Ответ №1:

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

Ответ №2:

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

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

Ответ №3:

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

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

Комментарии:

1. ^_^ извините за мои ошибки в словах.

2. @AutoCoder: в StackOverflow рекомендуется повышать рейтинг полезных ответов и принимать их (маленькая галочка слева от оценки).