Эффективный способ заменить содержимое нескольких тегов с помощью Nokogiri - PullRequest
1 голос
/ 13 августа 2011

У меня есть RSS-документ с несколькими тегами, скажем, с именами <foo> и <bar>, где я хочу заменить / поменять содержимое.Какой самый эффективный способ сделать это?Должен ли я анализировать весь канал и заменять его содержимое встроенным?Если это так, как будет выглядеть блок, если я захочу сделать это для двух вышеупомянутых узлов-братьев?

Требуется ли последовательный анализ документа и создание нового при просмотре содержимого?

Документ создается с чем-то вроде:

doc = Nokogiri::XML(open("http://example.com/rss.xml"))

Каков наилучший способ перебрать документ и изменить содержимое <foo> и <bar> с этого момента?

Ответы [ 2 ]

3 голосов
/ 13 августа 2011

Вы можете редактировать XML-документ прямо в памяти. Если вы ищете простой способ сделать это, вы можете использовать селекторы CSS. Следующий код изменит содержимое элементов foo и bar независимо от того, где они находятся в документе:

doc = Nokogiri::XML(open("http://example.com/rss.xml"))
for element in doc.css('foo, bar')
  element.content = "something"
end

Вы также можете использовать несколько селекторов CSS или XPath-запросов, посмотрите документацию Nokogiri:

2 голосов
/ 13 августа 2011
xml = "<r>
  <foo>Hello<b>World</b></foo>
  <x>It's <bar>Nice</bar> to see you.</x>
  <foo>Here's another</foo>
  <y>Don't touch me.</y>
</r>"

require 'nokogiri'
doc = Nokogiri::XML(xml)

doc.search('foo,bar').each do |node|
  node.inner_html = "I am #{node.name} and I used to say #{node.text.inspect}"
end

puts doc
#=> <?xml version="1.0"?>
#=> <r>
#=>   <foo>I am foo and I used to say "HelloWorld"</foo>
#=>   <x>It's <bar>I am bar and I used to say "Nice"</bar> to see you.</x>
#=>   <foo>I am foo and I used to say "Here's another"</foo>
#=>   <y>Don't touch me.</y>
#=> </r>

Вы также можете использовать doc.xpath('//foo|//bar'), чтобы найти все элементы foo и bar на любой глубине.(Хотя синтаксис CSS короче и достаточно мощный.)

В будущем вы должны предоставить фактический образец анализируемого XML и фактический пример того типа преобразования, который вы хотитеприменять.

...