使用Nokogiri替换几个标签内容的有效方法

时间:2011-08-13 18:00:37

标签: ruby-on-rails ruby nokogiri

我有一个RSS文档,其中包含一些标记,比如名为<foo><bar>,我想要替换/按摩内容。这样做最有效的方法是什么?我是否解析整个Feed并替换内联内容?如果是这样的话,如果我想为上面的两个兄弟节点做这个块会怎么样?

是否需要按顺序解析文档并在浏览内容时创建新文档?

该文档的创建类似于:

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

从那一点开始迭代doc并修改<foo><bar>的内容的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

您可以直接在内存中编辑XML文档。如果您正在寻找简单的方法,可以使用CSS选择器。以下代码将更改foobar元素的内容,无论它们位于文档中的哪个位置:

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

您还可以使用多个CSS选择器或XPath查询,看看Nokogiri文档:

答案 1 :(得分:2)

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')查找任意深度的所有foobar元素。 (但CSS语法更短,功能更强大。)

将来,您应提供要解析的XML的实际样本,以及您希望应用的转换类型的实际样本。