#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 рекомендуется повышать рейтинг полезных ответов и принимать их (маленькая галочка слева от оценки).