[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 & 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 & 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 & 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