如何使用REXML + XPATH删除XML文档中的所有注释?

时间:2015-12-18 18:50:42

标签: ruby xml xpath rexml

我有一个XML文件,其中包含大量注释,使文件超大且混乱。是否可以使用REXML删除其中的注释?

我已经尝试了这个,但它没有用(但奇怪的是,它也没有失败):

doc.elements.each('//comment()') { |n| doc.delete n }

更新

这有效:

require 'rexml/document'

doc = REXML::Document.new "<root><foo><!-- comment --></foo></root>"

doc.elements('//*').each { |n| n.comments().each { |c| c.parent = nil } }

formatter = REXML::Formatters::Pretty.new(4)

formatter.compact = true

puts formatter.write(doc.root, '')

# Output:  
#
# <root>
#    <foo/>
# </root>

我从here(ruby-doc.org)获得了解决方案。

2 个答案:

答案 0 :(得分:1)

REXML::XPath.match(doc, '//comment()').each(&:remove)

REXML :: XPath是一个包含搜索文档中节点的方法的类。 match方法将返回一组节点。第一个参数是一个节点,必须从该节点开始搜索。第二个参数是用于搜索的xpath。

它返回一个包含找到的所有元素的数组,然后运行remove方法。 上面的表达式删除了文档中的所有注释。

链接到REXML::XPath documentation

答案 1 :(得分:0)

尝试

def del_comments(node)
  node.comments().each { |comment| node.delete comment }
  node.elements().each { |child| del_comments(child) }
end

del_comments(doc)

完整代码段

require "rexml/document"
include REXML  # so that we don't have to prefix everything with REXML::...
string = <<EOF
<!-- comment 1 -->
  <mydoc>
    <someelement attribute="nanoo">Text, text, text</someelement>
    <!-- comment 2 -->
    <foo>
      <!-- comment 3 -->
      <bar>whatever</bar>
      <!-- comment 4 -->
    </foo>
    <!-- comment 5 -->
    <baz>...</baz>
    <!-- comment 6 -->
  </mydoc>
<!-- comment 7 -->
EOF

doc = Document.new string

def del_comments(node)
  node.comments().each { |comment| node.delete comment }
  node.elements().each { |child| del_comments(child) }
end

del_comments(doc)

puts doc

输出

  <mydoc>
    <someelement attribute='nanoo'>Text, text, text</someelement>

    <foo>

      <bar>whatever</bar>

    </foo>

    <baz>...</baz>

  </mydoc>

所以删除所有评论。