如何创建XML模板?

1 投票
1 回答
3568 浏览
提问于 2025-04-16 15:47

我有两个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能更新“Settings”这一部分。感谢你的建议。谢谢!

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 个回答

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

顺便说一下,
关于第一个例子,如果我在添加新内容之前不先删除旧的内容,你会在下面得到两个节点,这就是我先删除旧的再创建新的原因。

撰写回答