Как предотвратить удаление строки комментария из строки xml.ElementTree - PullRequest
10 голосов
/ 23 марта 2011

У меня есть следующий фрагмент кода:

    from xml.etree.ElementTree import fromstring,tostring
    mathml = fromstring(input)
    for elem in mathml.getiterator():
        elem.tag = 'm:' + elem.tag
    return tostring(mathml)

Когда я ввожу следующее input:

<math>
  <a> 1 2 3 </a>  <b />
<foo>Uitleg</foo>
<!-- <bar> -->
</math>

В результате:

<m:math>
  <m:a> 1 2 3 </m:a>  <m:b />
<m:foo>Uitleg</m:foo>

</m:math>

Как получилось? И как мне сохранить комментарий?

edit : Меня не интересует точная используемая библиотека xml, однако я должен иметь возможность вносить изменения в теги. К сожалению, lxml, похоже, не позволяет этого (и я не могу использовать правильные операции с пространством имен)

1 Ответ

14 голосов
/ 24 марта 2011

Вы не можете с xml.etree, потому что его парсер игнорирует комментарии (кстати, это приемлемое поведение для парсера xml). Но вы можете это сделать, если используете (совместимую) библиотеку lxml , которая позволяет настраивать параметры синтаксического анализатора .

from lxml import etree

parser = etree.XMLParser(remove_comments=False)
tree = etree.parse('input.xml', parser=parser)
# or alternatively set the parser as default:
# etree.set_default_parser(parser)

Это был бы самый простой вариант. Если вам действительно нужно использовать xml.etree, вы можете попробовать подключить свой собственный анализатор, хотя даже в этом случае комментарии официально не поддерживаются: посмотрите этот пример (от автора xml.etree) (кстати, все еще работает в python 2.7)

...