Suche Anfängerfreundliches SAX Tutorial

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

Hallo Leute!

Für eine Benchmark Analyse muss ich Daten aus XML-Dateien auswerten.
Die Ergebnisse möchte ich dann mit Hilfe von DocBOOK-XML auswerten, damit ein Report der Benchmark Analyse möglichste automatisch erstellt werden kann.

Leider hab ich noch nicht wirklich mit XML-Parsern gearbeitet.

Ich habe das Forum schon durchsucht, hab aber keinen für mich brauchbaren Hinweis für ein gutes und anfängerfreundliches SAX Tutorial gefunden. Hat wer einen Hinweis für mich, wo ich da was finden könnte?


Danke.

Johannes
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Vielleicht schaust du mal die DevShed Zutorials durch oder auch mal bei XML.com reingucken. Darüber hinaus gibt es auch noch das Buch Python & XML von O'Reilly.

Davon abgesehen ist SAX nicht gerade etwas, womit ich DocBook ganz sicher nicht parsen würde. Da spart mir DOM oder ETree viele Stunden mühseliger Arbeit.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

Hi!
Hat SAX überhaupt wesentliche Vorteile gegenüber DOM?

Lg
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

keboo hat geschrieben:Hat SAX überhaupt wesentliche Vorteile gegenüber DOM?
Speicherschonender (da nicht der gesammte DOM-Tree im Speicher gehalten wird), ggf schneller (je nachdem wie du die SAX-Handler schreibst).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
keboo
User
Beiträge: 132
Registriert: Sonntag 19. Februar 2006, 14:03

Hallo Leute!

Quelle des Codes: http://www.devshed.com/c/a/Python/Worki ... and-Python

Ich hätte da eine Frage bzgl. OOP in diesem Fall. Bin ein Newbie auf dem Gebiet.

Code: Alles auswählen

import xml.sax
# Create a collection list
collection = []
# This handles the parsing of the content
class HandleCollection ( xml.sax.ContentHandler ):
   def __init__ ( self ):
      self.book = {}
      self.title = False
      self.author = False
      self.genre = False
   # Called at the start of an element
   def startElement ( self, name, attributes ):
      if name == 'title':
         self.title = True
      elif name == 'author':
         self.author = True
      elif name == 'genre':
         self.genre = True
   # Called at the end of an element
   def endElement ( self, name ):
      if name == 'book':
         collection.append ( self.book )
         self.book = {}
      elif name == 'title':
         self.title = False
      elif name == 'author':
         self.author = False
      elif name == 'genre':
         self.genre = False
   # Called to handle content besides elements
   def characters ( self, content ):
      if self.title:
         self.book [ 'title' ] = content
      elif self.author:
         self.book [ 'author' ] = content
      elif self.genre:
         self.book [ 'genre' ] = content
# Parse the collection
parser = xml.sax.make_parser()
parser.setContentHandler ( HandleCollection() )
parser.parse ( 'collection.xml' )
Welche Aufgabe hat die Funktion characters? Was passiert in dieser Funktion? " # Called to handle content besides elements " verstehe ich nicht ganz.

Vollständigkeitshalber ist hier die XML Quelle:

Code: Alles auswählen


<?xml version="1.0" encoding="UTF-8"?>
<collection>
   <book>
      <title>The Once and Future King</title>
      <author>T.H. White</author>
      <genre>Fantasy</genre>
   </book>
   <book>
      <title>The Curse of Chalion</title>
      <author>Lois McMaster Bujold</author>
      <genre>Fantasy</genre>
   </book>
   <book>
      <title>Paladin of Souls</title>
      <author>Lois McMaster Bujold</author>
      <genre>Fantasy</genre>
   </book>
   <book>
      <title>Alas, Babylon</title>
      <author>Pat Frank</author>
      <genre>Fiction</genre>
   </book>
   <book>
      <title>Rifles for Wattie</title>
      <author>Harold Keith</author>
      <genre>Fiction</genre>
   </book>
</collection>
Danke!

Johannes[/b]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mach in die Funktion characters am Anfang ein print content, dann siehst du, wann und mit welchen Daten es aufgerufen ist.

Achja, bei der Gelegenheit kannst du den Code auch PEP 8 kompatibel machen ;) (Forensuche nach PEP 8 gibt viele Informationen).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

keboo hat geschrieben: Ich hätte da eine Frage bzgl. OOP in diesem Fall. Bin ein Newbie auf dem Gebiet.

[...]

Welche Aufgabe hat die Funktion characters? Was passiert in dieser Funktion? " # Called to handle content besides elements " verstehe ich nicht ganz.
Du solltest nicht einfach das Argument in das Dictionary übernehmen, sondern an den schon vorhandenen Text im Dictionary anhängen. Es ist nicht garantiert, dass der gesamte Inhalt zwischen zwei Tags in einem einzigen Aufruf von `characters()` übergeben wird.

`collections` würde ich in die Klasse verschieben und brauchst Du die Flags für die einzelnen Teile eines Buches unbedingt?
Antworten