使用python ElementTree向xml结构添加其他元素

使用python ElementTree向xml结构添加其他元素,python,xml,elementtree,Python,Xml,Elementtree,我试图从xml格式中提取一条记录,并将其相乘,这样每个新实例将包含特定字段的不同值 我认为最好的方法是准备一个包含单个实例(虚拟实例)的框架xml文件(见下文)。然后,我的脚本将指向这个实例,对于每个循环迭代,它将用所需的值替换它的字段,并将其追加回xml树 xml文件: 不幸的是,我得到的是,根据上一次迭代,在所有附加的实例中都有相同的值 xxx.xml: 0001-01-01T00:00:00 /applications/safari.app/contents/macos/safari /

我试图从xml格式中提取一条记录,并将其相乘,这样每个新实例将包含特定字段的不同值

我认为最好的方法是准备一个包含单个实例(虚拟实例)的框架xml文件(见下文)。然后,我的脚本将指向这个实例,对于每个循环迭代,它将用所需的值替换它的字段,并将其追加回xml树

xml文件: 不幸的是,我得到的是,根据上一次迭代,在所有附加的实例中都有相同的值

xxx.xml:

0001-01-01T00:00:00
/applications/safari.app/contents/macos/safari
/Applications/Safari.app/Contents/MacOS/Safari
/applications/safari.app/contents/macos/safari
/Applications/Safari.app/Contents/MacOS/Safari
/applications/safari.app/contents/macos/safari
/Applications/Safari.app/Contents/MacOS/Safari

你能告诉我我做错了什么吗

经过一些研究,我意识到我只是一次又一次地复制同一个实例(因此,当我在其中一个实例中设置字段时,它将应用于所有复制)

为了获取实例副本而不是副本,我使用了copy.deepcopy()方法,如以下代码段所示:

for app in self.apps:
    l=copy.deepcopy(process_root)
    l.find("d3p1:Name",ns).text = lower.app
    l.find("d3p1:Path",ns).text = app
    processes.append(l)
import xml.etree.ElementTree as ET
self.tree = ET.parse(infile)
self.root = self.tree.getroot()

processes    = self.root.find("Processes")    
process_root = self.root.find("Processes").find("ProtectedProcess")

for app in self.apps:
    process_root.find("Name").text = app.lower()
    process_root.find("Path",ns).text = app
    processes.append(process_root)

fd = open("./xxx.xml", "wb")
self.tree.write(fd, encoding='utf-8', xml_declaration=False)
<?xml version="1.0" encoding="utf-8"?>
<ServerData>
<CreationDate>0001-01-01T00:00:00</CreationDate>
<Processes>
   <ProtectedProcess>
       <Name>/applications/safari.app/contents/macos/safari</Name>
       <Path>/Applications/Safari.app/Contents/MacOS/Safari</Path>
   </ProtectedProcess>
   <ProtectedProcess>
       <Name>/applications/safari.app/contents/macos/safari</Name>
       <Path>/Applications/Safari.app/Contents/MacOS/Safari</Path>
   </ProtectedProcess>
   <ProtectedProcess>
       <Name>/applications/safari.app/contents/macos/safari</Name>
       <Path>/Applications/Safari.app/Contents/MacOS/Safari</Path>
   </ProtectedProcess>
 </Processes>
</ServerData>
for app in self.apps:
    l=copy.deepcopy(process_root)
    l.find("d3p1:Name",ns).text = lower.app
    l.find("d3p1:Path",ns).text = app
    processes.append(l)