[python] jak na xml

RMiklos na pss.sk RMiklos na pss.sk
Čtvrtek Prosinec 18 21:27:05 CET 2008




Cau,

Parsovat mozes pouzitim SAX a DOM, co Python standardne umoznuje.

Tu su nato priklady:

Dany je XML-dokument books5.xml, ktory vypada takto:

<?xml version="1.0" encoding="windows-1250"?>
<catalog>
  <book isbn="1-56592-724-9">
    <title>The Cathedral &amp; the Bazaar</title>
    <author>Eric S. Raymond</author>
  </book>
  <book isbn="1-56592-051-1">
    <title>Making TeX Work</title>
    <author>Norman Walsh</author>
  </book>
  <book isbn="80-247-0367-X">
    <title>Naučte se Python</title>
    <author>Mark Lutz &amp; David Ascher</author>
  </book>
  <book isbn="63-558-81">
    <title>Kompilátory čislicových počítačov</title>
    <author>David Gries</author>
  </book>
  <book isbn="80-05-00153-3">
    <title>Algoritmy a štruktúry údajov</title>
    <author>Niklaus Wirth</author>
  </book>
  <book isbn="80-05-00153-3">
    <title>Algoritmy a štruktúry údajov</title>
    <author>Niklaus Wirth</author>
  </book>
  <book isbn="80-7226-799-X">
    <title>Začínáme programovat v jazyce Python</title>
    <author>Daryl Harms &amp; Kenneth McDonald</author>
  </book>
  <book isbn="80-251-0343-9">
    <title>Algoritmy - Datové struktury a programovací techniky</title>
    <author>Piotr Wróblewski</author>
  </book>
  <book isbn="80-86330-05-2">
    <title>Python - Podrobná referenční příručka pro programovací jazyk
    Python</title>
    <author>David M. Beazley</author>
  </book>
  <book isbn="x-y-z">
    <title>Průvodce jazykem SCHEME</title>
    <author>Skoupil, D., Kopka, M.</author>
  </book>
  <book isbn="3-89319-744-3">
    <title>Einführung in die Automathentheorie, Formale Sprachen und
    Komplexitätstheorie</title>
    <author>John E. Hopcroft, Jeffrey D. Ullman</author>
  </book>
  <book isbn="80-247-0442-0">
    <title>PHP4 - Učebnice základů jazyka</title>
    <author>Jiří Bráza</author>
  </book>
  <book isbn="80-247-0441-2">
    <title>PHP4 - Praktické příklady</title>
    <author>Jiří Bráza</author>
  </book>
</catalog>


Parsovanie pouzitim DOM: dombook.py

import pprint
import xml.dom.minidom
from xml.dom.minidom import Node
doc = xml.dom.minidom.parse("books5.xml")
mapping = {}
# Vratit vsetky prvky typu "book"
# print doc.getElementsByTagName("book")
# Pre kazdy prvok "book"
for node in doc.getElementsByTagName("book"):
  #urcit hodnotu atributu "isbn"
  isbn = node.getAttribute("isbn")
  # Zoznam dat ku knihe bude tvorit nazov a autor
  bookdata = []

  # vratist vsetky prvky typu "title"
  L = node.getElementsByTagName("title")
  # pre kazdy prvok typu "title"
  for node2 in L:
    title = ""
    #print node2.childNodes
    for node3 in node2.childNodes:
      if node3.nodeType == Node.TEXT_NODE:
        title += node3.data
    bookdata.append(title)
  # vratist vsetky prvky typu "author"
  L = node.getElementsByTagName("author")
  # pre kazdy prvok typu "author"
  for node2 in L:
    author = ""
    #print node2.childNodes
    for node3 in node2.childNodes:
      if node3.nodeType == Node.TEXT_NODE:
        author += node3.data
    bookdata.append(author)
  # vytvorit polozku slovniku
  mapping[isbn] = bookdata
keys = mapping.keys()
#keys.sort()
# vytlacit kluce a polozky slovnika do suboru
sf=open('knihy_DOM.txt','w')
for key in keys:
  s1=mapping[key][1].ljust(25)
  s2=mapping[key][0].ljust(30)
  # parsovane retazce su zakodovane do unicode, preto ich treba previest
  # do cp1250
  line = "%s:  %s\n(ISBN %s)\n"\
     %(s1.encode('cp1250'), s2.encode('cp1250'), key.encode('cp1250'))
  sf.write(line)
sf.close()

Vysledkom je subor knihy_DOM.txt, ktory vypada takto:

David M. Beazley         :  Python - Podrobná referenční příručka pro
programovací jazyk Python
(ISBN 80-86330-05-2)
Niklaus Wirth            :  Algoritmy a štruktúry údajov
(ISBN 80-05-00153-3)
Norman Walsh             :  Making TeX Work
(ISBN 1-56592-051-1)
Daryl Harms & Kenneth McDonald:  Začínáme programovat v jazyce Python
(ISBN 80-7226-799-X)
John E. Hopcroft, Jeffrey D. Ullman:  Einführung in die Automathentheorie,
Formale Sprachen und Komplexitätstheorie
(ISBN 3-89319-744-3)
Piotr Wróblewski         :  Algoritmy - Datové struktury a programovací
techniky
(ISBN 80-251-0343-9)
Skoupil, D., Kopka, M.   :  Průvodce jazykem SCHEME
(ISBN x-y-z)
Jiří Bráza               :  PHP4 - Učebnice základů jazyka
(ISBN 80-247-0442-0)
Eric S. Raymond          :  The Cathedral & the Bazaar
(ISBN 1-56592-724-9)
David Gries              :  Kompilátory čislicových počítačov
(ISBN 63-558-81)
Jiří Bráza               :  PHP4 - Praktické příklady
(ISBN 80-247-0441-2)
Mark Lutz & David Ascher :  Naučte se Python
(ISBN 80-247-0367-X)

Parsovanie pouzitim SAX: saxbook.py

import xml.sax.handler
class BookHandler(xml.sax.handler.ContentHandler):
  def __init__(self):
    self.inTitle = 0
    self.inAuthor = 0
    self.mapping = {}
  def startElement(self, name, attributes):
    if name == "book":
      # Zoznam dat ku knihe bude tvorit nazov a autor
      self.bookdata = []
      self.title = ""
      self.author = ""
      self.isbn = attributes["isbn"]
    elif name == "title":
      self.inTitle = 1
    elif name == "author":
      self.inAuthor = 1
  def characters(self, data):
    if self.inTitle:
      self.title += data
    elif self.inAuthor:
      self.author +=data

  def endElement(self, name):
    if name == "title":
      self.inTitle = 0
      self.bookdata.append(self.title)
    elif name == "author":
      self.inAuthor = 0
      self.bookdata.append(self.author)
    self.mapping[self.isbn] = self.bookdata
    # pre kontrolu
    # print self.mapping
import xml.sax
import pprint
parser = xml.sax.make_parser( )
handler = BookHandler( )
parser.setContentHandler(handler)
parser.parse("books5.xml")
# pre kontrolu
# print handler.mapping
# pprint.pprint(handler.mapping)
keys = handler.mapping.keys()
#keys.sort()
# vytlacit kluce a polozky slovnika
sf=open('knihy_SAX.txt','w')
for key in keys:
  s1=handler.mapping[key][1].ljust(25)
  s2=handler.mapping[key][0].ljust(30)
  # parsovane retazce su zakodovane do unicode, preto ich treba previest
  # do cp1250
  line = "%s:  %s\n(ISBN %s)\n"\
     %(s1.encode('cp1250'), s2.encode('cp1250'), key.encode('cp1250'))
  sf.write(line)
sf.close()

Vysledkom je subor knihy_SAX.txt, ktory vypada takisto ako knihy_DOM.txt

(Vsetko pripajam v prilohe)


S pozdravom

Roman





-----python-bounces na py.cz wrote: -----


To: "Konference PyCZ" <python na py.cz>
From: "Ondrej Beranek" <rainbof na gmail.com>
Sent by: python-bounces na py.cz
Date: 18.12.2008 14:13
Subject: [python] jak na xml

Ahoj je tomu téměř přesně rok co jsem naposled sáhnul na python. Dneska
jsem se dostal k tomu že bych znovu potřeboval
jeho služby. Řeším úlohu jejíž součástí je přečtení XML souboru a změna
(přesněji přepsání) některých hodnot (dat).

například mám něco jako (ted sem to vymyslel konkretni priklad nemohu
uvest):

<dokument>
 <komponenta>
   <typ>auto_login</typ>
   <jmeno>prihlaseni</jmeno>
   <username>jmeno nekam</username>
   <passwd>heslo1<passwd>
 </komponenta>

 <komponenta>
   <typ>auto_login</typ>
   <jmeno>logovani</jmeno>
   <username>jmeno nekam</username>
   <passwd>heslo1<passwd>
  </komponenta>
</dokument>

No a ja nekdy budu menit hodnotu <username> a <password> ovsem v zavislosti
na typu a a nekdy i jmene.

No chtel bych vas poprosit aby jste mi poradili nejakou komponentu se
kterou mate zkusenosti ze by zvladla takove xml (1.0 utf8) precist a zas
ulozit.

Ondřej Beránek
_______________________________________________
Python mailing list
Python na py.cz
http://www.py.cz/mailman/listinfo/python
(See attached file: books5.xml)(See attached file: dombook.py)(See attached
file: saxbook.py)(See attached file: knihy_DOM.txt)(See attached file:
knihy_SAX.txt)
------------- další část ---------------
A non-text attachment was scrubbed...
Name: books5.xml
Type: application/octet-stream
Size: 1880 bytes
Desc: [žádný popis není k dispozici]
URL: <http://www.py.cz/pipermail/python/attachments/20081218/0a830b79/attachment.obj>
------------- další část ---------------
A non-text attachment was scrubbed...
Name: dombook.py
Type: application/octet-stream
Size: 1559 bytes
Desc: [žádný popis není k dispozici]
URL: <http://www.py.cz/pipermail/python/attachments/20081218/0a830b79/attachment-0001.obj>
------------- další část ---------------
A non-text attachment was scrubbed...
Name: saxbook.py
Type: application/octet-stream
Size: 1639 bytes
Desc: [žádný popis není k dispozici]
URL: <http://www.py.cz/pipermail/python/attachments/20081218/0a830b79/attachment-0002.obj>
------------- další část ---------------
David M. Beazley         :  Python - Podrobná referen?ní p?íru?ka pro programovací jazyk Python
(ISBN 80-86330-05-2)
Niklaus Wirth            :  Algoritmy a štruktúry údajov  
(ISBN 80-05-00153-3)
Norman Walsh             :  Making TeX Work               
(ISBN 1-56592-051-1)
Daryl Harms & Kenneth McDonald:  Za?ínáme programovat v jazyce Python
(ISBN 80-7226-799-X)
John E. Hopcroft, Jeffrey D. Ullman:  Einführung in die Automathentheorie, Formale Sprachen und Komplexitätstheorie
(ISBN 3-89319-744-3)
Piotr Wróblewski         :  Algoritmy - Datové struktury a programovací techniky
(ISBN 80-251-0343-9)
Skoupil, D., Kopka, M.   :  Pr?vodce jazykem SCHEME       
(ISBN x-y-z)
Ji?í Bráza               :  PHP4 - U?ebnice základ? jazyka
(ISBN 80-247-0442-0)
Eric S. Raymond          :  The Cathedral & the Bazaar    
(ISBN 1-56592-724-9)
David Gries              :  Kompilátory ?islicových po?íta?ov
(ISBN 63-558-81)
Ji?í Bráza               :  PHP4 - Praktické p?íklady     
(ISBN 80-247-0441-2)
Mark Lutz & David Ascher :  Nau?te se Python              
(ISBN 80-247-0367-X)
------------- další část ---------------
David M. Beazley         :  Python - Podrobná referen?ní p?íru?ka pro programovací jazyk Python
(ISBN 80-86330-05-2)
Niklaus Wirth            :  Algoritmy a štruktúry údajov  
(ISBN 80-05-00153-3)
Norman Walsh             :  Making TeX Work               
(ISBN 1-56592-051-1)
Daryl Harms & Kenneth McDonald:  Za?ínáme programovat v jazyce Python
(ISBN 80-7226-799-X)
John E. Hopcroft, Jeffrey D. Ullman:  Einführung in die Automathentheorie, Formale Sprachen und Komplexitätstheorie
(ISBN 3-89319-744-3)
Piotr Wróblewski         :  Algoritmy - Datové struktury a programovací techniky
(ISBN 80-251-0343-9)
Skoupil, D., Kopka, M.   :  Pr?vodce jazykem SCHEME       
(ISBN x-y-z)
Ji?í Bráza               :  PHP4 - U?ebnice základ? jazyka
(ISBN 80-247-0442-0)
Eric S. Raymond          :  The Cathedral & the Bazaar    
(ISBN 1-56592-724-9)
David Gries              :  Kompilátory ?islicových po?íta?ov
(ISBN 63-558-81)
Ji?í Bráza               :  PHP4 - Praktické p?íklady     
(ISBN 80-247-0441-2)
Mark Lutz & David Ascher :  Nau?te se Python              
(ISBN 80-247-0367-X)


Další informace o konferenci Python