Python编辑xml文件

时间:2016-05-30 21:46:28

标签: 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>info@creactive.sk</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 个答案:

答案 0 :(得分: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>info@creactive.sk</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')

要添加您需要在write中指定的编码:

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的相同代码:

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