python 元素树 xml 追加
python elementtree xml append
我在向 xml 文件添加元素时遇到了一些问题
我有一个 xml 这种结构:
<Root>
<Item>
<ItemId>first</ItemId>
<Datas>
<Data>one</Data>
<Data>two</Data>
<Data>three</Data>
</Datas>
</Item>
<Item>
<ItemId>second</ItemId>
<Datas>
<Data>one</Data>
<Data>two</Data>
<Data>three</Data>
</Datas>
</Item>
</Root>
并且我只想在itemid为第二个时添加数据,并得到这样的输出:
<Root>
<Item>
<ItemId>first</ItemId>
<Datas>
<Data>one</Data>
<Data>two</Data>
<Data>three</Data>
</Datas>
</Item>
<Item>
<ItemId>second</ItemId>
<Datas>
<Data>one</Data>
<Data>two</Data>
<Data>three</Data>
<Data>FOUR</Data>
<Data>FIVE</Data>
</Datas>
</Item>
</Root>
感谢您的帮助!
不清楚您是要如何找到添加元素的位置还是如何添加元素本身。
对于这个具体的例子,为了找到位置,你可以尝试这样的事情:
import xml.etree.ElementTree as ET
tree=ET.parse('xml-file.txt')
root=tree.getroot()
for item in root.findall('Item'):
itemid=item.find('ItemId')
if(itemid.text=='second'):
#add elements
对于实际添加部分,您可以尝试:
new=ET.SubElement(item[1],'Data')
new.text='FOUR'
new=ET.SubElement(item[1],'Data')
new.text='FIVE'
或
new=ET.Element('Data')
new.text='FOUR'
child[1].append(new)
new=ET.Element('Data')
new.text='FIVE'
child[1].append(new)
还有其他几种方法可以完成这两个部分,但总的来说,文档非常有用:https://docs.python.org/2/library/xml.etree.elementtree.html
编辑:
如果"Datas"元素再往下,可以使用与上面相同的Element.find()方法来查找指定标签的第一次出现。 (Element.findall() returns 指定标签所有出现的列表)。
以下应该可以解决问题:
data=item.find('Datas')
new=ET.SubElement(data,'Data')
new.text='FOUR'
new=ET.SubElement(data,'Data')
new.text='FIVE'
您可以按照以下方式找到 Datas
节点并将元素附加到它。
from lxml import etree
from xml.etree import ElementTree as ET
xml_str = """<Root>
<Item>
<ItemId>first</ItemId>
<Datas>
<Data>one</Data>
<Data>two</Data>
<Data>three</Data>
</Datas>
</Item>
<Item>
<ItemId>second</ItemId>
<Datas>
<Data>one</Data>
<Data>two</Data>
<Data>three</Data>
</Datas>
</Item>
</Root>"""
# build the tree
tree = etree.fromstring(xml_str)
# get all items nodes
items = tree.findall('Item')
for item in items:
# get ItemId text
item_id = item.findtext('ItemId')
if item_id == 'second':
# get the Datas node
datas = item.find('Datas')
# add an element to it
new_data = ET.SubElement(datas, 'Data')
new_data.text = 'New Data'
# print the final xml tree
print etree.tostring(tree)
我在向 xml 文件添加元素时遇到了一些问题
我有一个 xml 这种结构:
<Root>
<Item>
<ItemId>first</ItemId>
<Datas>
<Data>one</Data>
<Data>two</Data>
<Data>three</Data>
</Datas>
</Item>
<Item>
<ItemId>second</ItemId>
<Datas>
<Data>one</Data>
<Data>two</Data>
<Data>three</Data>
</Datas>
</Item>
</Root>
并且我只想在itemid为第二个时添加数据,并得到这样的输出:
<Root>
<Item>
<ItemId>first</ItemId>
<Datas>
<Data>one</Data>
<Data>two</Data>
<Data>three</Data>
</Datas>
</Item>
<Item>
<ItemId>second</ItemId>
<Datas>
<Data>one</Data>
<Data>two</Data>
<Data>three</Data>
<Data>FOUR</Data>
<Data>FIVE</Data>
</Datas>
</Item>
</Root>
感谢您的帮助!
不清楚您是要如何找到添加元素的位置还是如何添加元素本身。
对于这个具体的例子,为了找到位置,你可以尝试这样的事情:
import xml.etree.ElementTree as ET
tree=ET.parse('xml-file.txt')
root=tree.getroot()
for item in root.findall('Item'):
itemid=item.find('ItemId')
if(itemid.text=='second'):
#add elements
对于实际添加部分,您可以尝试:
new=ET.SubElement(item[1],'Data')
new.text='FOUR'
new=ET.SubElement(item[1],'Data')
new.text='FIVE'
或
new=ET.Element('Data')
new.text='FOUR'
child[1].append(new)
new=ET.Element('Data')
new.text='FIVE'
child[1].append(new)
还有其他几种方法可以完成这两个部分,但总的来说,文档非常有用:https://docs.python.org/2/library/xml.etree.elementtree.html
编辑:
如果"Datas"元素再往下,可以使用与上面相同的Element.find()方法来查找指定标签的第一次出现。 (Element.findall() returns 指定标签所有出现的列表)。
以下应该可以解决问题:
data=item.find('Datas')
new=ET.SubElement(data,'Data')
new.text='FOUR'
new=ET.SubElement(data,'Data')
new.text='FIVE'
您可以按照以下方式找到 Datas
节点并将元素附加到它。
from lxml import etree
from xml.etree import ElementTree as ET
xml_str = """<Root>
<Item>
<ItemId>first</ItemId>
<Datas>
<Data>one</Data>
<Data>two</Data>
<Data>three</Data>
</Datas>
</Item>
<Item>
<ItemId>second</ItemId>
<Datas>
<Data>one</Data>
<Data>two</Data>
<Data>three</Data>
</Datas>
</Item>
</Root>"""
# build the tree
tree = etree.fromstring(xml_str)
# get all items nodes
items = tree.findall('Item')
for item in items:
# get ItemId text
item_id = item.findtext('ItemId')
if item_id == 'second':
# get the Datas node
datas = item.find('Datas')
# add an element to it
new_data = ET.SubElement(datas, 'Data')
new_data.text = 'New Data'
# print the final xml tree
print etree.tostring(tree)