Вопрос по xml, python, dom – Скрипт Python для удаления всех комментариев из файла XML

4

Я пытаюсь создать сценарий Python, который будет принимать XML-документ и удалять из него все блоки комментариев.

Я попробовал что-то вроде:

tree = ElementTree()
tree.parse(file)
commentElements = tree.findall('//comment()')

for element in commentElements:
    element.parentNode.remove(element)

Это приводит к странной ошибке в python: & quot; KeyError: & apos; () & apos;

Я знаю, что есть способы легко отредактировать файл, используя другие методы (например, sed), но я должен сделать это в скрипте Python.

'//comment()' не является допустимым форматом пути поиска и вызывает KeyError. Не могли бы вы включить этот пример XML и расширить шаблон, который вы пытаетесь поймать? jdi
Не могли бы вы добавить небольшой пример XML-документа? Glider
comment() тест узла XPath, который не поддерживается ElementTree Пытатьсяlxml, который имеет полную поддержку XPath 1.0. mzjn
lxml также реализует интерфейс etree AFAIK Daenyth

Ваш Ответ

4   ответа
11

comment() тест узла XPath, который не поддерживается ElementTree

Ты можешь использоватьcomment() сLXML, Эта библиотека очень похожа на ElementTree и имеет полную поддержку XPath 1.0.

Вот как вы можете удалить комментарии с помощью lxml:

from lxml import etree

XML = """<root>
  <!-- COMMENT 1 -->
  <x>TEXT 1</x>
  <y>TEXT 2 <!-- COMMENT 2 --></y>
</root>"""

tree = etree.fromstring(XML)

comments = tree.xpath('//comment()')

for c in comments:
    p = c.getparent()
    p.remove(c)

print etree.tostring(tree)

Выход:

<root>
  <x>TEXT 1</x>
  <y>TEXT 2 </y>
</root>
8

from lxml import etree
XML = """<root>
  <!-- COMMENT 1 -->
  <x>TEXT 1</x>
  <y>TEXT 2 <!-- COMMENT 2 --></y>
  </root>"""

tree = etree.fromstring(XML)
print etree.tostring(tree)
etree.strip_tags(tree,etree.Comment)
print etree.tostring(tree)

Выход:

<root>
<!-- COMMENT 1 -->
<x>TEXT 1</x>
<y>TEXT 2 <!-- COMMENT 2 --></y>
</root>
<root>

<x>TEXT 1</x>
<y>TEXT 2 </y>
</root>
4

https://stackoverflow.com/a/3317008/1458574

from lxml import etree
import sys

XML = open(sys.argv[1]).read()
parser =  etree.XMLParser(remove_comments=True)
tree= etree.fromstring(XML, parser = parser)
print etree.tostring(tree)
remove_comments=True работает нормально, но в связанном ответе не используется. Так почему вы говорите, что это "то же самое"?
3

 def removeCommentNodes(self):
        for tag in self.dom.getElementsByTagName("*"):
            for n in tag.childNodes:
                if n.nodeType is dom.Node.COMMENT_NODE:
                    n.parentNode.removeChild(n)

На практике я сначала извлекаю все теги в xml, затем для каждого тега я ищу узлы комментариев и, если они найдены, я удаляю их. (self.dom - это ссылка на разобранный xml)

Похожие вопросы