我有一个RSS文档,其中包含一些标记,比如名为<foo>
和<bar>
,我想要替换/按摩内容。这样做最有效的方法是什么?我是否解析整个Feed并替换内联内容?如果是这样的话,如果我想为上面的两个兄弟节点做这个块会怎么样?
是否需要按顺序解析文档并在浏览内容时创建新文档?
该文档的创建类似于:
doc = Nokogiri::XML(open("http://example.com/rss.xml"))
从那一点开始迭代doc并修改<foo>
和<bar>
的内容的最佳方法是什么?
答案 0 :(得分:3)
您可以直接在内存中编辑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文档:
答案 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')
查找任意深度的所有foo
和bar
元素。 (但CSS语法更短,功能更强大。)
将来,您应提供要解析的XML的实际样本,以及您希望应用的转换类型的实际样本。