У меня есть 2 скрипта Python, которые записываются в один и тот же файл XML. Я использую Python2.5 и WinXP. Как создать шаблон, чтобы файл XML не был перезаписан при запуске другого Python script. Он только обновит раздел в 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
Код по умолчанию .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")
Прочитайте и просто обновите конкретный раздел вместо всего файла, например ниже
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 ) )
BTW,
Что касается первого примера, если я не удаляю перед добавлением нового, вы получите два node, поэтому я сначала использую удаление, чтобы удалить старый и создать новый.