如何创建XML模板?

时间:2011-04-15 04:53:54

标签: python xml templates

我有2个Python脚本写入同一个XML文件。我正在使用Python2.5和WinXP。 如何创建模板,以便在运行其他Python脚本时不会覆盖XML文件。它只会使用值更新XML中的部分。例如:XML模板如下:

<Test>
 <Default>
   <Value>1</Value> 
   <Link_Status>0</Link_Status> 
   <Lane_Status>1</Lane_Status> 
 </Default>
 <Settings>
  <Point>4</Point> 
  <Delay>1</Delay> 
 </Settings>
</Test>

我希望default.py更新为Default部分,而Settings.py更新设置部分。感谢你的建议。 TQ

Default.py代码:

import elementtree.ElementTree as ET 

root=ET.Element("Test")
head1=ET.SubElement(root,"Default")
title=ET.SubElement(head1,"Value")
title.text="1"

title=ET.SubElement(head1,"Link_Status")
title.text="0"

title=ET.SubElement(head1,"Lane_Status")
title.text="1"

tree=ET.ElementTree(root)
tree.write("C:\Python25\myscript\cmm\\config.xml")

Settings.py代码:

import elementtree.ElementTree as ET

root=ET.Element("Test")
head2=ET.SubElement(root,"Settings")
title=ET.SubElement(head2,"Point")
title.text=("4")

title=ET.SubElement(head2,"Delay")
title.text=("1")

tree=ET.ElementTree(root)
tree.write("C:\Python25\myscript\cmm\\config.xml")

1 个答案:

答案 0 :(得分:1)

阅读并更新特定部分而不是整个文件,如下所示

from xml.etree import ElementTree as ET
with open("test.xml") as f:
    root = ET.parse( f ).getroot()

# update <Default>
root.remove( root.find("./Default") )

defaultNode = ET.SubElement(root,"Default")
ET.SubElement(defaultNode,"Value").text = "999"
ET.SubElement(defaultNode,"Link_Status").text = "888"
ET.SubElement(defaultNode,"Lane_Status").text = "777"

with open("test.xml" , "w" ) as f:
    f.write( ET.tostring( root ) )

----编辑添加新内容 -

实际上,我只是想告诉你如何阅读文件并更新某些部分,然后将其写出来,而不必每次都创建一个新的xml内容。好的,如果您的xml结构是静态的,您可以通过使用XPATH定位来更新特定文本,也许以下一个可以解决您的小问题。

from xml.etree import ElementTree as ET
with open("test.xml") as f:
root = ET.parse( f ).getroot()

# update <Default>
root.find("./Default/Value").text = "999"
root.find("./Default/Link_Status").text = "888"
root.find("./Default/Lane_Status").text = "777"

with open("test.xml" , "w" ) as f:
    f.write( ET.tostring( root ) )

顺便说一句,
关于第一个例子,如果我在添加新节点之前没有删除它,你将得到两个节点,这就是为什么我首先使用remove删除旧节点并创建一个新节点。