首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法迭代REXML中的元素

无法迭代REXML中的元素
EN

Stack Overflow用户
提问于 2011-06-21 12:52:15
回答 1查看 586关注 0票数 0

我使用Ruby在选定的XML节点周围注入新元素。如下所示:

代码语言:javascript
复制
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 )

这是我想要的结构:

代码语言:javascript
复制
<fmxmlsnippet type='FMObjectList'>
    <node/>
    <Step name='Variable'/>
    <node/>
    <Step name='Comment'/>
    <node/>
    <Step name='Variable'/>
    <node/>
</fmxmlsnippet>' 

但这是我在上面的代码中得到的结果:

代码语言:javascript
复制
<fmxmlsnippet type='FMObjectList'>
    <Step name='Variable'/>
    <Step name='Comment'/>
    <Step name='Variable'/>
    <node/>
</fmxmlsnippet>' 

我做错了什么?

我猜这与我对代码块是如何执行的缺乏理解有关。路径似乎可以工作,因为它可以很好地打印所需元素的属性。

我想继续使用REXML,因为它是Ruby发行版的一部分,但如果我能让它以这种方式工作,我会考虑Nokogiri。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-21 13:27:15

这是在使用Nokogiri。我更喜欢并推荐它,因为它非常灵活,而且现在已经成为Ruby的事实上的标准。

代码语言:javascript
复制
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"]'也能正常工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6420485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档