Как закомментировать XML ‹Tag› ​​с помощью ElementTree

Я хотел бы прокомментировать такой текст:

<name>cranberry</name>

Однако мой скрипт возвращает вывод следующим образом:

<!-- &lt;name&gt;cranberry&lt;/name&gt; -->

Мой сценарий:

import xml.etree.ElementTree as ET
from xml.etree.ElementTree import Comment

tree = ET.parse(r"C:\sample.xml") 
root = tree.getroot() 
comment = ET.Comment("<name>cranberry</name>")
root.insert(0,comment)
tree.write(r"C:\sample1.xml")

Любой совет будет принят во внимание.


person fairyberry    schedule 12.01.2013    source источник
comment
Я не работал над этим. Глядя на документы, я предлагаю вам сначала добавить узел, получить дескриптор недавно вставленного узла и запустить для него метод .Comment, сохранить дерево.   -  person shahkalpeshp    schedule 12.01.2013
comment
Это может быть Minidom... если мне не нужно устанавливать внешние библиотеки...   -  person fairyberry    schedule 12.01.2013
comment
@MartijnPieters: Вы правы. я имею в виду, получить дескриптор существующего узла и запустить .comment на нем. Я предполагаю, что каждый узел является, так сказать, поддеревом.   -  person shahkalpeshp    schedule 12.01.2013
comment
Беглый взгляд на исходный код minidom показывает, что он действительно не ускользнет от комментариев.   -  person Martijn Pieters    schedule 12.01.2013
comment
@shahkalpesh: я знаю, что вы имели в виду, но это не сработает. :-)   -  person Martijn Pieters    schedule 12.01.2013
comment
На самом деле, я не могу воспроизвести это, не на Python 2.7. Какая это версия питона? Только метод записи html мог избежать подобных комментариев в версии 2.7.   -  person Martijn Pieters    schedule 12.01.2013
comment
Я проверил Python 2.6, и он действительно ускользнет в любом случае. Можете ли вы перейти на Python 2.7 или установить ElementTree как внешнюю библиотеку?   -  person Martijn Pieters    schedule 12.01.2013
comment
@Martijn: я видел еще один пост о комментировании XML через Python (stackoverflow.com/questions/8764017/), хотя я не понимаю, что они делают. Как вы думаете, это может относиться к моему случаю?   -  person fairyberry    schedule 12.01.2013
comment
@ user1027101: Они используют minidom, вы можете использовать это повторно. Я пишу ответ, должен быть сделан через минуту или около того.   -  person Martijn Pieters    schedule 12.01.2013
comment
@Martijn: Правда? Да, я использовал Python 2.6. Буду обновлять до 2.7. Спасибо!!   -  person fairyberry    schedule 12.01.2013


Ответы (1)


Старая библиотека ElementTree, включенная в Python 2.6, действительно безоговорочно экранирует XML-данные в комментариях:

$ python2.6 -c "from xml.etree import ElementTree as ET; print ET.tostring(ET.Comment('<'))"
<!-- &lt; -->

У вас есть несколько вариантов:

  • Обновите до Python 2.7; он правильно обрабатывает сериализацию комментариев:

    $python2.7 -c "from xml.etree import ElementTree as ET; print ET.tostring(ET.Comment('<'))"
    <!--<-->
    
  • Установите внешнюю библиотеку ElementTree.

  • Используйте Minidom (не рекомендуется, DOM API слишком многословен):

    from xml.dom import minidom
    
    doc = minidom.parse(r"C:\sample.xml")
    
    comment = doc.createComment("<name>cranberry</name>")
    doc.documentElement.appendChild(comment)
    
    doc.writexml(r"C:\sample1.xml")
    
person Martijn Pieters    schedule 12.01.2013
comment
Это прекрасный ответ; есть +1. - person timday; 12.01.2013