2015-12-18 67 views
0

我有一個XML文件,有大量的評論,使文件超大和泥濘。是否可以使用REXML從註釋中刪除註釋?如何使用REXML + XPATH從XML文檔中刪除所有註釋?

我已經試過這一點,但它不工作(不過,奇怪的是,它不是失敗其一):

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

UPDATE

這工作:

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

嘗試

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> 

因此所有的評論將被刪除。

+0

嗯..悲傷。它永遠遞歸直到它死亡。非常先驅式。 – bitcycle

+0

@bitcycle,它不會永久爲我遞歸,也不會死亡,而是刪除所有註釋節點。 –

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

REXML :: XPath是一個包含用於搜索文檔中節點的方法的類。匹配方法將返回一個節點數組。第一個參數是一個節點,搜索必須從哪裏開始。第二個參數是用於搜索的xpath。

它返回一個包含找到的所有元素的數組,然後運行remove方法。 以上表達式將刪除文檔中的所有註釋。

鏈接到REXML::XPath documentation

相關問題