[python] XML
RMiklos na pss.sk
RMiklos na pss.sk
Čtvrtek Červen 14 12:52:18 CEST 2007
>nevim jak napsat to prohledavani.
>parser by mel umet podle nejake podminky i vyhledavat ne?
>nejak sem to tam nenasel
>bo to nejak pres cyklus cely prochazet?
Pouzil som doteraz len standardne moduly: xml.sax a xml.dom.
Co sa tyka prechadzania dokumentu je to podla toho ci pouzijes SAX- alebo
DOM-parser.
Pri SAXe sa nadefinujeje trieda pre handler a pri DOMe sa to da prechadzat
v cykle
for node in doc.getElementsByTagName(...)
Ale najlepsi je konkretny priklad.
Majme tento xml-subor so zoznamom knih
-------------------------------------------------------
<?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>
-------------------------------------------------------
Tu je priklad ako prechadzat tento xml-dokument cez DOM
-------------------------------------------------------
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
for key in keys:
print "%s: %s\n(ISBN %s)\n"\
% (mapping[key][1].ljust(25), mapping[key][0].ljust(30), key)
-------------------------------------------------------
a tu je priklad ako sa to da prechadzat cez SAX
-------------------------------------------------------
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
for key in keys:
print "%s: %s\n(ISBN %s)\n"\
% (handler.mapping[key][1].ljust(25), handler.mapping[key][0].ljust(30),
key)
-------------------------------------------------------
Subory prikladam
"Luboš Melichar" <lubos.melichar na gmail.com>
Sent by: python-bounces na py.cz
14.06.2007 10:15
Please respond to
Konference PyCZ <python na py.cz>
To
python na py.cz
cc
Subject
[python] XML, amara
zdravim..
potrebuju zpracovat XML..
tzn. otevrit soubor, najit urcity tag, vypsat ho a zmenit mu parametr...
koukal sem na amara
http://uche.ogbuji.net/tech/4suite/etc/amara-manual.html
nevim jak napsat to prohledavani.
parser by mel umet podle nejake podminky i vyhledavat ne?
nejak sem to tam nenasel
bo to nejak pres cyklus cely prochazet?
mohl byste nekdo nastinit nejaky funkcni priklad...?
dikes _______________________________________________
Python mailing list
Python na py.cz
http://www.py.cz/mailman/listinfo/python
Mgr. Ing. Roman MIKLÓŠ
Prvá stavebná sporiteľňa a.s.
Bajkalská 30, P. O. Box 48
829 48 Bratislava 25
Tel.: +421/ 2 / 582 31 174
Fax: +421/ 2 / 582 31 109
------------- další část ---------------
Netextová příloha byla odstraněna...
Jméno: books5.xml
Typ: application/octet-stream
Velikost: 1880 bytes
Popis: [žádný popis není k dispozici]
Url : http://www.py.cz/pipermail/python/attachments/20070614/caddf4a4/attachment.obj
------------- další část ---------------
Netextová příloha byla odstraněna...
Jméno: dombook5.py
Typ: application/octet-stream
Velikost: 1328 bytes
Popis: [žádný popis není k dispozici]
Url : http://www.py.cz/pipermail/python/attachments/20070614/caddf4a4/attachment-0001.obj
------------- další část ---------------
Netextová příloha byla odstraněna...
Jméno: saxbook5.py
Typ: application/octet-stream
Velikost: 1415 bytes
Popis: [žádný popis není k dispozici]
Url : http://www.py.cz/pipermail/python/attachments/20070614/caddf4a4/attachment-0002.obj
Další informace o konferenci Python