1

I am very new one here, I am searching here for more than our, but I can not find answer.

I need to edit xml file using python. I have current structure:

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

I need to replace word DLPrij with DLVyd and save as new file.

Can anybody help me how to do it? I will need to run it then ask task schedule on my Synology NAS server.

I forgot to mention, the file will be located in folder: /volume1/Temp/DLPrij.xml and the output file should be named as DLVyd.xml in a same folder. Is it possible to include it in you help? :)

Thank you!

1

1 Answer 1

3

Just find the nodes and change 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)

So to parse from a file and create the new output file:

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

To add the encoding you just need to specify in write:

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

To change the node text for the KPFromOdb nodes if it is equal to 0:

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

Then again just write:

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

If you plan on doing a lot of work with xml then lxml would be worth installing and using, xml has limited xpath support but lxml has comprehensive support and it is very efficient. The same code using 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")
Sign up to request clarification or add additional context in comments.

20 Comments

Hi Padraic, Thank you for your answer. I forgot to mention, the file will be located in folder: /volume1/Temp/DLPrij.xml and the output file should be named as DLVyd.xml in a same folder. Is it possible to include it in you help? :) thank you!
Sure you could import and use ElementTree or even MiniDom but it would be faster and less memory intensive to use string mutation (not noticeable at this size). xml_string.replace("DLPrij ", "DLVyd") and the same with the closing tag.
Works great! thank you. I only need to fix one thing, the program which creates xml uses <?xml version="1.0" encoding="windows-1250"?> and I need to add it on a first line and also use windows-1250 encoding, is it possible?
@TheLazyScripter, try that and see what happens. "DLPrij " would not actually replace anything, "DLPrij" would replace more than it should
Works great! Many thanks! I need to replace there some other words, so I will try to do it by myself, in case of any questions I will get back :) many thanks again.
|

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.