【问题标题】:Python edit xml filePython编辑xml文件
【发布时间】:2016-05-30 21:46:27
【问题描述】:

我是这里的新手,我在这里搜索的不仅仅是我们的,但我找不到答案。

我需要使用 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 在同一文件夹中。是否可以将其包含在您的帮助中? :)

谢谢!

【问题讨论】:

标签: python xml


【解决方案1】:

只需找到节点并更改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")

【讨论】:

  • 嗨帕德莱克,谢谢你的回答。我忘了提,该文件将位于文件夹中:/volume1/Temp/DLPrij.xml 并且输出文件应在同一文件夹中命名为 DLVyd.xml。是否可以将其包含在您的帮助中? :) 谢谢!
  • 当然您可以导入和使用 ElementTree 甚至 MiniDom,但使用字符串突变会更快且内存占用更少(在这种大小下不明显)。 xml_string.replace("DLPrij ", "DLVyd") 和结束标签一样。
  • 效果很好!谢谢你。我只需要修复一件事,创建 xml 的程序使用 我需要在第一行添加它并使用 windows-1250 编码,是有可能吗?
  • @TheLazyScripter,试试看会发生什么。 "DLPrij " 实际上不会取代任何东西,"DLPrij" 会取代更多的东西
  • 效果很好!非常感谢!我需要替换一些其他的词,所以我会尝试自己做,如果有任何问题我会回复:) 再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
相关资源
最近更新 更多