#python #python-3.x #xml #xml-parsing #elementtree
Вопрос:
Я пытаюсь использовать xml.etree.ElementTree
для анализа xml-строки, поиска определенного тега и переноса дочернего тега путем добавления родительского тега .
Мой XML:
<a>
<b>text1</b>
<c>text2</c>
</a>
Желаемый XML:
<a>
<b>text1</b>
<new_parent_tag_added>
<c>text2</c>
</new_parent_tag_added>
</a>
Текущий код:
document_root = etree.ElementTree(etree.fromstring( XML_STRING))
root = document_root.find('a')
b = etree.SubElement(root, 'new_parent_tag_added')
c = etree.SubElement(b, 'c')
В приведенном выше коде, как я могу сохранить значение существующего тега <c>
, чтобы он соответствовал желаемому xml?
Ответ №1:
С помощью встроенного модуля ElementTree вы можете сделать (спасибо @mzjn):
c = root.find('c')
etree.SubElement(root, 'new_parent_tag_added').append(c)
root.remove(c)
С lxml.etree это немного короче:
etree.SubElement(root, 'new_parent_tag_added').append(root.find('c'))
В любом случае полезно помнить, что узлы ведут себя как списки, поэтому вы можете добавлять объекты.
Комментарии:
1. Этот код работает с lxml. С помощью ElementTree это приводит к появлению двух
c
элементов на выходе. Необходимо явноеroot.remove(c)
указание.2. @mzjn есть ли какой-нибудь способ, которым я могу это сделать
from xml.etree import ElementTree as etree
?3. Да, вам нужно удалить «исходный»
c
элемент.4. Кстати, обратитесь к встроенному модулю как к «дереву элементов». «xml»-это просто пакет верхнего уровня, и он содержит несколько подмодулей, связанных с XML: docs.python.org/3/library/xml.html .
5. @mzjn не могли бы вы поделиться каким-нибудь примером, который удовлетворяет моему вышеуказанному требованию?