2016-05-30 103 views
1

我在这里很新,我在这里寻找的比我们多,但我找不到答案。Python编辑xml文件

我需要使用python编辑xml文件。我目前的结构:

<?xml version="1.0" encoding="windows-1250"?> 
<MoneyData ICAgendy="46501401" KodAgendy="" HospRokOd="2016-01-01" HospRokDo="2016-12-31" description="všetky skladové doklady" ExpZkratka="_S" ExpDate="2016-05-19" ExpTime="00:01:00" VyberZaznamu="0"><SeznamDLPrij><DLPrij><CisloDokla>DLP16010</CisloDokla><KPFromOdb>0</KPFromOdb><Datum>2016-05-19</Datum><SouhrnDPH><Zaklad0>0</Zaklad0><Zaklad5>0</Zaklad5><Zaklad22>18.03</Zaklad22><DPH5>0</DPH5><DPH22>3.61</DPH22></SouhrnDPH><Celkem>21.64</Celkem><DRada>DLPrr</DRada><Vystavil>Filip Kotian</Vystavil><Nadpis>Dodací list</Nadpis><PorizCena>18.03</PorizCena><PopisX>Easy-Fix rám na hodváb 94 x 94 cm</PopisX><Fiskal>0</Fiskal><FisDoklad>0</FisDoklad><DatSkPoh>2016-05-19</DatSkPoh><SazbaDPH1>10</SazbaDPH1><SazbaDPH2>20</SazbaDPH2><DodOdb><ObchNazev>Čarovné farby s.r.o.</ObchNazev><ObchAdresa><Ulice>Montážna 15</Ulice><Misto>Prievidza</Misto><PSC>97104</PSC><Stat>Slovensko</Stat><KodStatu>SK</KodStatu></ObchAdresa><FaktNazev>Čarovné farby s.r.o.</FaktNazev><FaktAdresa><Ulice>Montážna 15</Ulice><Misto>Prievidza</Misto><PSC>97104</PSC><Stat>Slovensko</Stat><KodStatu>SK</KodStatu></FaktAdresa><ICO>50232240</ICO><DIC>SK2120235865</DIC><GUID>{FB837366-4B25-4E71-BB0E-856F60DDA187}</GUID><Nazev>Čarovné farby s.r.o.</Nazev><PlatceDPH>1</PlatceDPH><FyzOsoba>0</FyzOsoba><DICSK>2120235865</DICSK></DodOdb><DopravTuz>0</DopravTuz><DopravZahr>0</DopravZahr><Sleva>0</Sleva><Polozka><Nazev>Easy-Fix rám na hodváb 94 x 94 cm</Nazev><PocetMJ>1</PocetMJ><Cena>18.03</Cena><Valuty>0</Valuty><DPH>20</DPH><CenaTyp>0</CenaTyp><Sleva>0</Sleva><Vratka>0</Vratka><UcetMD>000000</UcetMD><UcetD>000000</UcetD><Hmotnost>0</Hmotnost><PorizCena>18.03</PorizCena><CenaPoSleve>1</CenaPoSleve><Sklad><Nazev>Pebeo</Nazev><KodSkladu>pebeo</KodSkladu><GUID>{786852E7-1ED4-4547-A941-C8F3320E726D}</GUID><CenikSklad>0</CenikSklad></Sklad><KmKarta><Popis>Easy-Fix rám na hodváb 94 x 94 cm</Popis><MJ>ks</MJ><GUID>{403D74BD-935B-4486-8A56-71272CB215CD}</GUID><Katalog>ASF1</Katalog><TypZarDoby>N</TypZarDoby><ZarDoba>0</ZarDoba><DesMist>0</DesMist><Obrazek>P:\ASF1.jpg</Obrazek><Hmotnost>0</Hmotnost><Objem>0</Objem><TypKarty>jednoducha</TypKarty></KmKarta></Polozka><MojeFirma><Nazev>creActive s.r.o.</Nazev><Adresa><Ulice>SNP 634/52</Ulice><Misto>Jalovec</Misto><PSC>97231</PSC><Stat>Slovensko</Stat><KodStatu>SK</KodStatu></Adresa><ObchNazev>creActive s.r.o.</ObchNazev><ObchAdresa><Ulice>SNP 634/52</Ulice><Misto>Jalovec</Misto><PSC>97231</PSC><Stat>Slovensko</Stat><KodStatu>SK</KodStatu></ObchAdresa><FaktNazev>creActive s.r.o.</FaktNazev><FaktAdresa><Ulice>SNP 634/52</Ulice><Misto>Jalovec</Misto><PSC>97231</PSC><Stat>Slovensko</Stat><KodStatu>SK</KodStatu></FaktAdresa><Tel><Pred></Pred><Cislo></Cislo><Klap></Klap></Tel><Fax><Pred></Pred><Cislo></Cislo><Klap></Klap></Fax><Mobil><Pred></Pred><Cislo>0915818465</Cislo></Mobil><EMail>[email protected]</EMail><WWW>www.creActive.sk</WWW><ICO>46501401</ICO><DIC>SK2023486278</DIC><DanIC>2023486278</DanIC><Banka>Fio banka, a.s., pobočka zahraničnej banky</Banka><Ucet>2500373646</Ucet><KodBanky>8330</KodBanky><KodPartn></KodPartn><FyzOsoba>0</FyzOsoba><MenaSymb>€</MenaSymb><MenaKod>EUR</MenaKod></MojeFirma></DLPrij></SeznamDLPrij></MoneyData> 

我需要用DLVyd替换单词DLPrij并保存为新文件。

任何人都可以帮我怎么做吗?我需要运行它,然后在我的Synology NAS服务器上询问任务计划。

我忘了提及,该文件将位于文件夹:/volume1/Temp/DLPrij.xml中,并且输出文件应在同一文件夹中命名为DLVyd.xml。是否有可能将其纳入您的帮助? :)

谢谢!

+1

的可能的复制(http://stackoverflow.com/questions/1591579/how-to-update-modify-a -xml-file-in-python) – Serenity

回答

3

只要找到节点,改变tag

from xml.etree import ElementTree as et 

x="""<?xml version="1.0" encoding="windows-1250"?> 
<MoneyData ICAgendy="46501401" KodAgendy="" HospRokOd="2016-01-01" HospRokDo="2016-12-31" description="všetky skladové doklady" ExpZkratka="_S" ExpDate="2016-05-19" ExpTime="00:01:00" VyberZaznamu="0"><SeznamDLPrij><DLPrij><CisloDokla>DLP16010</CisloDokla><KPFromOdb>0</KPFromOdb><Datum>2016-05-19</Datum><SouhrnDPH><Zaklad0>0</Zaklad0><Zaklad5>0</Zaklad5><Zaklad22>18.03</Zaklad22><DPH5>0</DPH5><DPH22>3.61</DPH22></SouhrnDPH><Celkem>21.64</Celkem><DRada>DLPrr</DRada><Vystavil>Filip Kotian</Vystavil><Nadpis>Dodací list</Nadpis><PorizCena>18.03</PorizCena><PopisX>Easy-Fix rám na hodváb 94 x 94 cm</PopisX><Fiskal>0</Fiskal><FisDoklad>0</FisDoklad><DatSkPoh>2016-05-19</DatSkPoh><SazbaDPH1>10</SazbaDPH1><SazbaDPH2>20</SazbaDPH2><DodOdb><ObchNazev>Čarovné farby s.r.o.</ObchNazev><ObchAdresa><Ulice>Montážna 15</Ulice><Misto>Prievidza</Misto><PSC>97104</PSC><Stat>Slovensko</Stat><KodStatu>SK</KodStatu></ObchAdresa><FaktNazev>Čarovné farby s.r.o.</FaktNazev><FaktAdresa><Ulice>Montážna 15</Ulice><Misto>Prievidza</Misto><PSC>97104</PSC><Stat>Slovensko</Stat><KodStatu>SK</KodStatu></FaktAdresa><ICO>50232240</ICO><DIC>SK2120235865</DIC><GUID>{FB837366-4B25-4E71-BB0E-856F60DDA187}</GUID><Nazev>Čarovné farby s.r.o.</Nazev><PlatceDPH>1</PlatceDPH><FyzOsoba>0</FyzOsoba><DICSK>2120235865</DICSK></DodOdb><DopravTuz>0</DopravTuz><DopravZahr>0</DopravZahr><Sleva>0</Sleva><Polozka><Nazev>Easy-Fix rám na hodváb 94 x 94 cm</Nazev><PocetMJ>1</PocetMJ><Cena>18.03</Cena><Valuty>0</Valuty><DPH>20</DPH><CenaTyp>0</CenaTyp><Sleva>0</Sleva><Vratka>0</Vratka><UcetMD>000000</UcetMD><UcetD>000000</UcetD><Hmotnost>0</Hmotnost><PorizCena>18.03</PorizCena><CenaPoSleve>1</CenaPoSleve><Sklad><Nazev>Pebeo</Nazev><KodSkladu>pebeo</KodSkladu><GUID>{786852E7-1ED4-4547-A941-C8F3320E726D}</GUID><CenikSklad>0</CenikSklad></Sklad><KmKarta><Popis>Easy-Fix rám na hodváb 94 x 94 cm</Popis><MJ>ks</MJ><GUID>{403D74BD-935B-4486-8A56-71272CB215CD}</GUID><Katalog>ASF1</Katalog><TypZarDoby>N</TypZarDoby><ZarDoba>0</ZarDoba><DesMist>0</DesMist><Obrazek>P:\ASF1.jpg</Obrazek><Hmotnost>0</Hmotnost><Objem>0</Objem><TypKarty>jednoducha</TypKarty></KmKarta></Polozka><MojeFirma><Nazev>creActive s.r.o.</Nazev><Adresa><Ulice>SNP 634/52</Ulice><Misto>Jalovec</Misto><PSC>97231</PSC><Stat>Slovensko</Stat><KodStatu>SK</KodStatu></Adresa><ObchNazev>creActive s.r.o.</ObchNazev><ObchAdresa><Ulice>SNP 634/52</Ulice><Misto>Jalovec</Misto><PSC>97231</PSC><Stat>Slovensko</Stat><KodStatu>SK</KodStatu></ObchAdresa><FaktNazev>creActive s.r.o.</FaktNazev><FaktAdresa><Ulice>SNP 634/52</Ulice><Misto>Jalovec</Misto><PSC>97231</PSC><Stat>Slovensko</Stat><KodStatu>SK</KodStatu></FaktAdresa><Tel><Pred></Pred><Cislo></Cislo><Klap></Klap></Tel><Fax><Pred></Pred><Cislo></Cislo><Klap></Klap></Fax><Mobil><Pred></Pred><Cislo>0915818465</Cislo></Mobil><EMail>[email protected]</EMail><WWW>www.creActive.sk</WWW><ICO>46501401</ICO><DIC>SK2023486278</DIC><DanIC>2023486278</DanIC><Banka>Fio banka, a.s., pobočka zahraničnej banky</Banka><Ucet>2500373646</Ucet><KodBanky>8330</KodBanky><KodPartn></KodPartn><FyzOsoba>0</FyzOsoba><MenaSymb>€</MenaSymb><MenaKod>EUR</MenaKod></MojeFirma></DLPrij></SeznamDLPrij></MoneyData>""" 


tree = et.fromstring(x) 

for node in tree.findall(".//DLPrij"): 
    node.tag = "DLVyd" 

print et.tostring(tree) 

所以从文件中解析和创建新的输出文件:

from xml.etree import ElementTree as et 


tree = et.parse("/volume1/Temp/DLPrij.xml ") 

for node in tree.findall(".//DLPrij"): 
    node.tag = "DLVyd" 
tree.write('/volume1/Temp/DLVyd.xml') 

要添加,你只需要在写入指定的编码:

tree.write('/volume1/Temp/DLVyd.xml',encoding="windows-1250") 

要更改KPFromOdb的节点文本如果它等于0节点:

for node in tree.findall(".//DLPrij"): 
    node.tag = "DLVyd" 
for node in tree.findall(".//KPFromOdb"): 
    if node.text == "0": 
     node.text = "1" 

然后再只写:

tree.write('/volume1/Temp/DLVyd.xml',encoding="windows-1250") 

如果你打算做了很多工作,使用XML,然后lxml将是值得安装和使用,xml有限xpath支持,但lxml具有全面的支持,并且非常高效。同样的代码中使用lxml的:?如何更新/修改Python中的XML文件]

import lxml.etree as et 
tree = et.parse("in.xml") 

for node in tree.xpath("//DLPrij"): 
    node.tag = "DLVyd" 
for node in tree.xpath("//KPFromOdb[text()='0']"): 
     node.text = "1" 
tree.write("new.xml", encoding="windows-1250") 
+0

嗨Padraic,谢谢你的回答。我忘了提及,该文件将位于文件夹/volume1/Temp/DLPrij.xml中,并且输出文件应在同一文件夹中命名为DLVyd.xml。是否有可能将其纳入您的帮助? :) 谢谢! –

+0

@FilipKotian,当然,编辑 –

+0

当然,你可以导入和使用ElementTree甚至MiniDom,但它会更快,更少的内存密集使用字符串变异(在这个尺寸不明显)。 'xml_string.replace(“DLPrij”,“DLVyd”)'和结束标记一样。 – TheLazyScripter