我有一个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)获得了解决方案。
答案 0 :(得分:1)
REXML::XPath.match(doc, '//comment()').each(&:remove)
REXML :: XPath是一个包含搜索文档中节点的方法的类。 match方法将返回一组节点。第一个参数是一个节点,必须从该节点开始搜索。第二个参数是用于搜索的xpath。
它返回一个包含找到的所有元素的数组,然后运行remove
方法。
上面的表达式删除了文档中的所有注释。
答案 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>
所以删除所有评论。