Python:LXML - 如何将元素添加到现有元素树
Python:LXML - How to add an element to an existing element tree
我需要通过向现有元素添加子元素来修改现有 xml 文件。我使用 lxml 库。
<addressbook>
<person>
<name>Eric Idle</name>
<phone type='fix'>999-999-999</phone>
<phone type='mobile'>555-555-555</phone>
<address>
<street>12, spam road</street>
<city>London</city>
<zip>H4B 1X3</zip>
</address>
</person>
</addressbook>
这里是XML;假设我想添加第二个名字:
<addressbook>
<person>
<name>Eric Idle</name>
<name>TEST TEST</name>
<phone type='fix'>999-999-999</phone>
<phone type='mobile'>555-555-555</phone>
<address>
<street>12, spam road</street>
<city>London</city>
<zip>H4B 1X3</zip>
</address>
</person>
</addressbook>
我知道我可以解析文件并使用 etree.getroot() 获取根目录,但我可以将 /adressbook/person 作为 etree.element 获取吗?
您可以使用 xpath 对所有感兴趣的 <name>
元素进行本地化,然后附加一个同级元素:
from lxml import etree
data = r'''
<addressbook>
<person>
<name>Eric Idle</name>
<phone type='fix'>999-999-999</phone>
<phone type='mobile'>555-555-555</phone>
<address>
<street>12, spam road</street>
<city>London</city>
<zip>H4B 1X3</zip>
</address>
</person>
<person>
<name>Eric Idle</name>
<phone type='fix'>999-999-999</phone>
<phone type='mobile'>555-555-555</phone>
<address>
<street>12, spam road</street>
<city>London</city>
<zip>H4B 1X3</zip>
</address>
</person>
</addressbook>
'''
doc = etree.fromstring(data)
#process the first <name> element of every person in addressbook
for name in doc.xpath('/addressbook/person/name[1]'):
parent = name.getparent()
parent.insert(parent.index(name)+1, etree.XML('<name>TEST TEST</name>'))
print(etree.tostring(doc))
我需要通过向现有元素添加子元素来修改现有 xml 文件。我使用 lxml 库。
<addressbook>
<person>
<name>Eric Idle</name>
<phone type='fix'>999-999-999</phone>
<phone type='mobile'>555-555-555</phone>
<address>
<street>12, spam road</street>
<city>London</city>
<zip>H4B 1X3</zip>
</address>
</person>
</addressbook>
这里是XML;假设我想添加第二个名字:
<addressbook>
<person>
<name>Eric Idle</name>
<name>TEST TEST</name>
<phone type='fix'>999-999-999</phone>
<phone type='mobile'>555-555-555</phone>
<address>
<street>12, spam road</street>
<city>London</city>
<zip>H4B 1X3</zip>
</address>
</person>
</addressbook>
我知道我可以解析文件并使用 etree.getroot() 获取根目录,但我可以将 /adressbook/person 作为 etree.element 获取吗?
您可以使用 xpath 对所有感兴趣的 <name>
元素进行本地化,然后附加一个同级元素:
from lxml import etree
data = r'''
<addressbook>
<person>
<name>Eric Idle</name>
<phone type='fix'>999-999-999</phone>
<phone type='mobile'>555-555-555</phone>
<address>
<street>12, spam road</street>
<city>London</city>
<zip>H4B 1X3</zip>
</address>
</person>
<person>
<name>Eric Idle</name>
<phone type='fix'>999-999-999</phone>
<phone type='mobile'>555-555-555</phone>
<address>
<street>12, spam road</street>
<city>London</city>
<zip>H4B 1X3</zip>
</address>
</person>
</addressbook>
'''
doc = etree.fromstring(data)
#process the first <name> element of every person in addressbook
for name in doc.xpath('/addressbook/person/name[1]'):
parent = name.getparent()
parent.insert(parent.index(name)+1, etree.XML('<name>TEST TEST</name>'))
print(etree.tostring(doc))