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

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