python xml.etree.ElementTree присоединяется к подэлементу

Я пытаюсь использовать xml.etree.ElementTree для анализа XML-файла, поиска определенного тега, добавления дочернего элемента в этот тег, добавления другого дочернего элемента к вновь созданному тегу и добавления текста к последнему ребенку.

Мой XML:

<root> <a> <b> <c>text1</c> </b> <b> <c>text2</c> </b> </a> </root> 

Желаемый XML:

 <root> <a> <b> <c>text1</c> </b> <b> <c>text2</c> </b> <b> <c>text3</c> </b> </a> </root> 

Текущий код:

 import xml.etree.ElementTree as ET tree = ET.parse('test.xml') root = tree.getroot() for x in root.iter(): if (x.tag == 'a'): ET.SubElement(x, 'b') ET.SubElement(x, 'c') #add text 

Это похоже на работу, за исключением того, что 'c' добавляет в качестве дочернего элемента 'a', а не 'b'

Вот так:

 <root> <a> <b> <c>test1</c> </b> <b> <c>test2</c> </b> <b /><c/></a> </root> 

Кроме того, как добавить текст к вновь созданному элементу 'c'? Я мог прокручивать до тех пор, пока не найду тег «c», у которого нет текста, но должен быть лучший способ.

2 Solutions collect form web for “python xml.etree.ElementTree присоединяется к подэлементу”

Вам нужно указать b как родительский элемент для c .

Кроме того, для получения тега вам не нужен цикл – просто возьмите root ( a ).

 import xml.etree.ElementTree as ET tree = ET.parse('test.xml') root = tree.getroot() a = root.find('a') b = ET.SubElement(a, 'b') c = ET.SubElement(b, 'c') c.text = 'text3' print ET.tostring(root) 

печатает:

 <root> <a> <b> <c>text1</c> </b> <b> <c>text2</c> </b> <b> <c>text3</c> </b> </a> </root> 

Я предпочитаю определять свою собственную функцию для добавления текста:

 def SubElementWithText(parent, tag, text): attrib = {} element = parent.makeelement(tag, attrib) parent.append(element) element.text = text return element 

Который тогда очень удобно использовать как:

 import xml.etree.ElementTree as ET tree = ET.parse('test.xml') root = tree.getroot() a = root.find('a') b = ET.SubElement(a, 'b') c = SubElementWithText(b, 'c', 'text3') 
  • BeautifulSoup подсчитывает теги без разбора внутри них
  • Измените XML с помощью ElementTree
  • xml.etree.ElementTree получает глубину узла
  • lxml xml разбор с тегами html внутри тегов xml
  • iterparse не может проанализировать поле, в то время как другие подобные
  • СинтаксисError символа не-ASCII
  • xml.sax парсер и номера строк и т. д.
  • Анализатор Python SVG
  • Python - лучший язык программирования в мире.