我使用Ruby在选定的XML节点周围注入新元素。如下所示:
require 'rexml/document'
include REXML
xml = <<EOF
<fmxmlsnippet type="FMObjectList">
<Step name="Variable"/>
<Step name="Comment"/>
<Step name="Variable"/>
</fmxmlsnippet>
EOF
doc = Document.new xml
el = Element.new 'node'
doc.elements.each( "//Step[@name=\"Variable\"]"){ |e|
e.previous_sibling = el
e.next_sibling = el
}
doc.write( $stdout, 2 )这是我想要的结构:
<fmxmlsnippet type='FMObjectList'>
<node/>
<Step name='Variable'/>
<node/>
<Step name='Comment'/>
<node/>
<Step name='Variable'/>
<node/>
</fmxmlsnippet>' 但这是我在上面的代码中得到的结果:
<fmxmlsnippet type='FMObjectList'>
<Step name='Variable'/>
<Step name='Comment'/>
<Step name='Variable'/>
<node/>
</fmxmlsnippet>' 我做错了什么?
我猜这与我对代码块是如何执行的缺乏理解有关。路径似乎可以工作,因为它可以很好地打印所需元素的属性。
我想继续使用REXML,因为它是Ruby发行版的一部分,但如果我能让它以这种方式工作,我会考虑Nokogiri。
发布于 2011-06-21 13:27:15
这是在使用Nokogiri。我更喜欢并推荐它,因为它非常灵活,而且现在已经成为Ruby的事实上的标准。
xml = <<EOT
<fmxmlsnippet type="FMObjectList">
<Step name="Variable"/>
<Step name="Comment"/>
<Step name="Variable"/>
</fmxmlsnippet>
EOT
require 'nokogiri'
doc = Nokogiri::XML(xml)
doc.search('Step[name="Variable"]').each do |s|
s.add_previous_sibling('<node/>')
s.add_next_sibling('<node/>')
end
puts doc.to_xml
# >> <?xml version="1.0"?>
# >> <fmxmlsnippet type="FMObjectList">
# >> <node/><Step name="Variable"/><node/>
# >> <Step name="Comment"/>
# >> <node/><Step name="Variable"/><node/>
# >> </fmxmlsnippet>它使用CSS accessors通过name="Variable"查找Step节点。对于遇到的每一个,它都会添加一个前一个和下一个同级<node>。Nokogiri也支持XPath,所以'//Step[@name="Variable"]'也能正常工作。
https://stackoverflow.com/questions/6420485
复制相似问题