xml.etree.Дерево элементов добавляет родительский тег к дочернему тегу

#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 не могли бы вы поделиться каким-нибудь примером, который удовлетворяет моему вышеуказанному требованию?