Seite 1 von 1

Suche Anfängerfreundliches SAX Tutorial

Verfasst: Montag 22. Mai 2006, 15:48
von keboo
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

Verfasst: Montag 22. Mai 2006, 16:57
von Leonidas
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.

Verfasst: Montag 22. Mai 2006, 18:36
von keboo
Hi!
Hat SAX überhaupt wesentliche Vorteile gegenüber DOM?

Lg

Verfasst: Montag 22. Mai 2006, 18:42
von Leonidas
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).

Frage bzegl SAX-Python Code

Verfasst: Dienstag 23. Mai 2006, 10:47
von keboo
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]

Verfasst: Dienstag 23. Mai 2006, 20:27
von Leonidas
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).

Re: Frage bzegl SAX-Python Code

Verfasst: Donnerstag 25. Mai 2006, 06:55
von 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?