XML nagrinėjimas su Pythonu

Posted by Paulius on 2009 Balandis 6 under Programavimas | Read the First Comment

Š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.

py_xml_change_source_code.

P.S. Berašant šį įrašą perskaičiau įdomų įrašą apie dabartį ir Python`o ateitį.

Taip pat skaitykite

  • 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ą