2015-12-18 4 views
0

У меня есть XML-файл, который содержит массу комментариев, которые делают файл супер большим и грязным. Можно ли удалить комментарии из REXML?Как удалить все комментарии из документа XML с помощью REXML + XPATH?

Я попытался это, но он не работает (хотя, как ни странно, его не подведет ни):

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

Hm .. печально. Он повторяется навсегда, пока он не умрет. Очень начальный эск. – bitcycle

+0

@bitcycle, он не рекурсирует навсегда для меня и не умирает, вместо этого удаляются все узлы комментариев. –

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

REXML :: XPath - это класс, содержащий методы поиска узлов в документе. Метод match вернет массив узлов. Первый аргумент - это узел, с которого должен начинаться поиск. Второй аргумент - это xpath, используемый для поиска.

Он возвращает массив, содержащий все найденные элементы, после чего вы запускаете метод remove. Вышеприведенное выражение удаляет все комментарии из документа.

Ссылка на REXML::XPath documentation