XML nagrinėjimas su Pythonu
Šiandien gavau užduotį: XML faile rasti sutrumpintą tekstą ir jį pakeisti pilnu. Su programavimu susipažinau pradėjęs studijuoti KTU, daug laiko jam niekada neskyriau, tad ir žinių – ne per daugiausia. Bet karts nuo karto kokią nors užduotelę išspręsti būna visai fun (ypatingai, kai pavyksta).
Apie Pythoną esu girdėjęs daug gero, tad pastaruoju metu vis išbandau jį. Džiugu, kad iki šiol neprašoviau pro šalį pasirinkdamas šią kalbą. Savaime suprantama, išmokti dirbti su nauja biblioteka, šiuo atveju – xml.dom.minidom – užtrunka. Tačiau prieš tai neteko dirbti su XML failais, tad kitu atveju užtrukčiau dar ilgiau. Tiems, kas menkai susipažinęs su šia kalba - daug geros informacijos Daliaus bloge.
Su mano pagrindais programavime, kokybės algoritmuose nepamatysite. Tačiau tikiuosi parodyti kaip paprastai įgyvendinti užduotį (sutrumpinti knygų pavadinimai pakeičiami į pilnus) su šia “gyvate”.
Knygų duomenys XML formatu bei naujų knygų pavadinimų sąrašas:
<?xml version="1.0" encoding="utf-8" ?> <knyga> <data> <record id="0"> <field name="code">0</field> <field name="title">Wikinomics</field> <field name="author">Don Tapscott</field> </record> <record id="1"> <field name="code">2</field> <field name="title">The success of OS</field> <field name="author">Steve Weber</field> </record> </data> </knyga>
0 Wikinomics: How mass collaboration changes everything 1 The success of open source
Pradžioje paprasčiausiai nuskaitome naujus knygų pavadinimus:
def read(name): listas = [] for line in open(name, "rb"): # skaitom po eilutę duomenų failą listas.append(line.strip()) # rašom duomenis į sąrašo galą, return listas # prieš tai pašalinę naujos eilutės simbolius
Metodai, kuriais nagrinėjau XML ir ieškojau reikiamų eilučių. Visus šiuos veiksmus man padėjo atlikti xml.dom.minidom, tai buvo gana paprasta, tiesiog teko susipažinti su DOM API.
def parese(): knygos = xml.dom.minidom.parse ('knyga.xml') #nuskaitom xml failą return knygos def change(ID, newname, knygos): records = knygos.documentElement.getElementsByTagName('record') # randame record elementus for record in records: if record.attributes['id'].nodeValue == ID: # Jeigu record id sutampa su pilno pavadinimo id fields = record.getElementsByTagName('field') # randame visus field elementus for field in fields: if field.attributes['name'].nodeValue == 'title': # Jeigu field name atributas tinkamas field.childNodes[0].nodeValue = newname # priskiriame pilną knygos pavadinimą return knygos
Likusieji trys metodai: paieškos, mūsų naujos XML struktūros išsaugojimas bei paleidžiamasis metodas main. XML išsaugojimui panaudojau PyXML biblioteką, vien todėl, kad minidom saugojimo funkcija toprettyxml() palieka nereikalingas tuščias vietas.
def search(alist): knygos = parese() n = 0 for n in range(len(alist)): if n % 2 == 0: knygos = change(alist[n], alist[n+1], knygos) return knygos def createxml(fname, knygos): failas = open(fname, "w") xml.dom.ext.PrettyPrint(knygos, failas) # panaudoję xml.dom.ext biblioteką failas.close() def main(): alist = read("knygos") knygos = search(alist) createxml("knyga_new.xml", knygos)
Rezultatas, kuris mane tenkino:
<?xml version='1.0' encoding='UTF-8'?> <knyga> <data> <record id='0'> <field name='code'>0</field> <field name='title'>Wikinomics: How mass collaboration changes everything</field> <field name='author'>Don Tapscott</field> </record> <record id='1'> <field name='code'>2</field> <field name='title'>The success of open source</field> <field name='author'>Steve Weber</field> </record> </data> </knyga>
Manau, Pythonas bus ganėtinai dažnai mano naudojama programavimo kalba. Nors optimistiškai spėju, kad su programavimu ateityje mažai susidursiu.
P.S. Berašant šį įrašą perskaičiau įdomų įrašą apie dabartį ir Python`o ateitį.

Dalius rašė,
Ačiū už paminėjimą. Reikės pasitempti :-)
O dėl straipsnio temos: jei ateityje dar kartą teks apdoroti xml’ą (ar html’ą) tai rekomenduoju lxml biblioteką. Yra ir kitų gerų bibliotekų (ElementTree, BeautifulSoup), bet jos turi savo nišą.
Parašykite komentarą