Как удалить комментарий вне элемента root документа XML, используя lxml - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть Python, и я пытаюсь убрать все комментарии из множества XML документов, которые я не контролирую. Это должно быть в состоянии обработать любой действительный XML. Вот код на данный момент:

tree = lxml.etree.parse(path_to_xml_file)
for c in tree.xpath('//comment()'):
  c.getparent().remove(c)

Этот код падает на этот конкретный XML файл:

<!-- This comment can't be removed. -->
<foo>
  <!-- This comment can be removed. -->
</foo>

Первый комментарий не может быть удален, поскольку у него нет родительского элемента. c.getparent() возвращает None для этого комментария. Я не вижу другой документации о том, как удалить узлы из дерева XML. Это действительно XML. Так как я могу удалить этот комментарий?

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Чтобы удалить все комментарии, используйте XMLParser с remove_comments=True.

from lxml import etree

parser = etree.XMLParser(remove_comments=True)
tree = etree.parse("test.xml", parser)
0 голосов
/ 07 апреля 2020

Это можно сделать, если вы оберните xml новым тегом либо до его синтаксического анализа с помощью l xml, либо после (что не очень красиво, но также работает).

Предполагается, что вы собираетесь сделать это за пределами l xml:

comt = """
<!-- This comment can't be removed. -->
<foo>
  <!-- This comment can be removed. -->
</foo>
"""

new_comt = "<super_root>"+comt+"</super_root>"
tree = etree.fromstring(new_comt)

и оттуда продолжить с вашим исходным кодом, который после

    print(etree.tostring(tree).decode())

выведет:

    <super_root><foo>
  </foo></super_root>

Затем вы можете также удалить тег обтекания, если это необходимо.

Как я уже сказал, не очень элегантно, но выполняет свою работу.

...