Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python元素树xml追加_Python_Xml_Parsing_Elementtree - Fatal编程技术网

python元素树xml追加

python元素树xml追加,python,xml,parsing,elementtree,Python,Xml,Parsing,Elementtree,我在向xml文件添加元素时遇到了一些麻烦 我有一个具有以下结构的xml: <Root> <Item> <ItemId>first</ItemId> <Datas> <Data>one</Data> <Data>two</Data> <Data>three</Da

我在向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为second时添加数据,并得到如下输出:

<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'

这两部分还有其他几种方法,但一般来说,文档非常有用:

编辑:

如果“Datas”元素位于较低的位置,则可以使用与上面相同的element.find()方法来查找指定标记的第一次出现。(Element.findall()返回指定标记的所有出现的列表)

下面应该可以做到这一点:

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)
从lxml导入etree
从xml.etree导入ElementTree作为ET
xml_str=”“”
第一
一
二
三
第二
一
二
三
"""
#建树
tree=etree.fromstring(xml\u str)
#获取所有项目节点
items=tree.findall('Item')
对于项目中的项目:
#获取ItemId文本
item_id=item.findtext('ItemId')
如果项目id=‘秒’:
#获取数据节点
datas=item.find('datas'))
#向其中添加一个元素
新建_data=ET.SubElement(数据,'data')
new_data.text='new data'
#打印最终的xml树
打印etree.tostring(树)

非常感谢,您的解决方案正在运行,但我有另一个问题:如果在“”和“”之间有另一个标记,它将停止工作,我如何找到数据节点并附加另一个数据?@SergiX44我编辑了答案以包含该信息。只需使用上面使用的Element.find()方法来查找所需标记的第一次出现。
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)