XML_Programmierung_Teil_1¶
ehemalige Veranstaltungen ia3.netz + ia3.data sowie ia4.Netz im Studiengang Interaktive Medien
(c) 2020/2021 Hochschule Augsburg - Fakultät für Informatik - Prof.Dr.Nik Klever
XML Programmierung - Teil 1 (Text, SAX)¶
1.) Einfache Textverarbeitung¶
mittels der Sting-Verarbeitung von Python
xmldokument = """<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE email SYSTEM "email.dtd">
<email>
<empfaenger>Henning Stoyke</empfaenger>
<absender>Nik Klever</absender>
<datum>2001-04-26</datum>
<thema>Aus dem Urlaub zurück ?</thema>
<nachricht>
Hallo Henning,
ich hoffe, Du bist gesund aus dem Urlaub zurück und
kannst mit frischem Wind unser Projekt beginnen !
Bis bald, Nik
</nachricht>
</email>"""
changed = xmldokument.replace("<empfaenger>","<recipient>").replace("</empfaenger>","</recipient>")
print(changed)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE email SYSTEM "email.dtd">
<email>
<recipient>Henning Stoyke</recipient>
<absender>Nik Klever</absender>
<datum>2001-04-26</datum>
<thema>Aus dem Urlaub zurück ?</thema>
<nachricht>
Hallo Henning,
ich hoffe, Du bist gesund aus dem Urlaub zurück und
kannst mit frischem Wind unser Projekt beginnen !
Bis bald, Nik
</nachricht>
</email>
Regular Expressions¶
mittels des Moduls Regular Expressions von Python
import re
m = re.match(".*<empfaenger>(?P<content>.*)</empfaenger>.*", xmldokument, re.DOTALL)
if m: print(m.groupdict())
else: print("kein Match")
{'content': 'Henning Stoyke'}
2.) SAX (Simple API for XML)¶
Generelles¶
Hier in diesem Skript wird nur auf die wichtigsten Eigenschaften von SAX Wert gelegt, genauere Angaben sowie diverse Einschränkungen oder Beschränkungen sind auf den Seiten des SAX Projekts selbst beschrieben. Die folgenden Abschnitte stammen aus dem XML-Skript von Mario Jeckle
Simple API for XML¶
Die Simple API for XML (abgekürzt zu: SAX) entstand aus einer durch David Megginson initiierten Aktivität der XML-Mailingliste xml-dev.
Sie stellt einen einfachen leichtgewichtigen Mechanismus für die Ereignis-basierte Verarbeitung von XML-Dokumenten dar. Die Charakterisierung als leichtgewichtiger Ansatz bezieht sich sowohl auf den Implementierungsaufwand der API selbst, als auch ihren Integrationsaufwand in eigene Applikationen.
Ursprünglich entstand die SAX-API aus einer Sammlung generischer Java-Schnittstellen für XML-Parser. Inzwischen hat sie sich jedoch als eigenständige Möglichkeit zur Verarbeitung von XML-Dokumenten in verschiedenen Hochsprachen entwickelt. So existieren neben den Umsetzungen für Java auch Implementierungen für C++, Python, Perl und Eiffel.
Struktur der SAX-API¶
SAX-Implementierungen weisen üblicherweise drei erkennbare Blöcke auf:
ParserFactory¶
Sie dient zur Erzeugung verschiedener Ausprägungen (z.B. validierend/nicht-validierend, Namespace berücksichtigend, etc.) SAX-basierter Parser.
Parser¶
Der Parser selbst. SAX definiert lediglich eine Sammlung abstrakter Schnittstellen, jedoch keine Implementierung. Diese Schnittstellen werden durch den jeweiligen eingesetzten Parser bedient und die definierten Call-back-Methoden entsprechend eingebunden.
Die Schnittstellen¶
ContentHandler¶
Versammelt Operationen zur Reaktion auf Dokumentereignisse (wie
startDocument, startElement, processingInstruction ...)
Hinweis: In älterer Literatur findet sich häufig statt des ContentHandlers
eine mit DocumentHandler benannte Schnittstelle. Sie stellt die
Vorgängerversion (SAX1), die u.a. keine Namensraumintegration bietet, des
ContentHandlers dar, und wurde durch diesen ersetzt.
ErrorHandler¶
Versammelt Operationen zur Reaktion auf die drei in der XML-Spezifikation
definierten Fehlerklassen:
* **error** (behebbarer Fehler)
z.B.: Anderer Wert als 1.0 im XML-Prolog oder ein nichtdeterministisches
Inhaltsmodell.
* **fatalError** (Fehler, der üblicherweise zum Abbruch der Verarbeitung führt)
z.B.: Unbekanntes Codierungsschema
* **warning** (Warnung)
z.B.: Referenzierung eines nicht deklarierten Elements als Kindelement.
DTDHandler¶
Möglichkeit zur Implementierung eigener Behandlungsroutinen für
Notation-Deklarationen und ungeparste Entitäten.
EntityResolver¶
Möglichkeit zur Implementierung von Auflösungsmechanismen für Entitäten
gemäß ihres system identifiers und, falls vorhanden, des public identifiers.
Das SAX-Ausführungsmodell¶
Jeder SAX-basierte Parser arbeitet nach demselben Ausführungsmodell. Es definiert eine Reihe von Ereignissen, die durch Operationen (sog. Call-Backs) behandelt werden.
Der Aufruf der Operationen zum Zeitpunkt des Ereigniseintritts erfolgt immer durch den Parser. Ein expliziter Aufruf durch den Programmierer sollte in jedem Falle unterbleiben!
Der resultierende Programmcode weist daher keinen erkennbaren durchgängigen Kontrollfluß auf, vielmehr ergibt sich dieser durch die serielle Aktivierung der verschiedenen Ereignisbehandlungsroutinen aus dem Eingabedokument.
SAX impliziert jedoch keinerlei Speicherstruktur zur Laufzeit. Als Konsequenz ist sein Ansatz -- mit nur geringen Modifikationen -- auf nahezu beliebige Programmiersprachen übertragbar. Darüberhinaus stellt SAX nur minimale Anforderungen an den verfügbaren Hauptspeicherausbau; der sich nach Art und Umfang der Übergabeparameter einer call-back-Operation richtet.
Diese Art der ereignisgetriebenen Verarbeitung eines XML-Dokuments eignet sich daher in besonderer Weise für Geräte mit geringem Hauptspeicherausbau, bzw. generell zur Verarbeitung von XML-Dokumenten die den verfügbaren oder adressierbaren Hauptspeicher übersteigen.
Da sich eine SAX-Applikation immer passiv verhält und auf Fremdaktivierung -- durch Auswerfen der entsprechenden Ereignisse -- wartet, wird dieses Ausführungsmodell auch als Push Model charakterisiert.
Aus der Anlage der SAX-Verarbeitung folgt direkt, daß es keinerlei Modifikationen am Eingangsdokument erlaubt. Lediglich durch veränderte Ausgabe des Eingabedokuments lassen sich einfache Transformationen realisieren.
Die SAX-Schnittstellen¶
Die grundlegende Schnittstelle der SAX-API wird mit ContentHandler bezeichnet, sie versammelt Operationen zur Abbildung des logischen Inhaltes eines XML-Dokumentes. Die in untenstehendem Beispiel verwendete Basisklasse DefaultHandler implementiert u.a. diese Schnittstelle und stellt sie so der Beispielapplikation zur Verfügung.
Die Übersicht der folgenden Tabelle stellt die einzelnen Operationen der Schnittstelle mit ihrer Signatur und Funktionalität zusammen.
Die Schnittstelle ContentHandler¶
| Operation | Funktionalität |
|---|---|
| startDocument() | Aufruf zu Beginn eines Dokuments. Naturgemäß wird diese Methode nur einmal ausgeführt. |
| processingInstruction(String target, String data) | Liefert die deklarierten Verarbeitungsanweisungen. Diese können vor und nach Eintritt des startDocument-Ereignisses auftreten. Spezifikationgemäß wird der XML-Prolog nicht als Processing Instruction behandelt und daher auch kein Ereignis dieses Typs ausgelöst. |
| startElement(String namespaceURI, String localName, String qName, Attributes atts) | Aufruf zu Beginn (öffnender Tag) eines Elements. Neben dem Elementnamen (ohne Namensraumpräfix: localName, oder als qualifizierter Name in qName) Anmerkung: Namensrauminformationen werden nur erzeugt, wenn der Parser entsprechend konfiguriert wurde. Objekte des Type Attributes enthalten die Attribute eines Elements in der Reihenfolge ihrer Definition. Zu jedem Attribut sind neben dem lokalen und dem qualifizierten Namen die Namensraum URI sowie Inhalt und Typ gemäß XML v1.0 abrufbar. |
| characters(char[] ch, int start, int length) | Aufruf bei der Verarbeitung von Zeichenkettendaten innerhalb eines Elements. ch enthält ab der Position start Zeichenketten-artige Daten der Länge length. |
| ignorableWhitespace(char[] ch, int start, int length) | Aufruf beim Auftreten ignorierbarer Leerzeichen im Sinne der XML-Spezifikation. |
| endElement(String namespaceURI, String localName, String qName) | Aufruf bei Erreichen eines Elementendes. Die Übergabeparameter entsprechen denen des zugehörigen startElement-Aufrufs. Anmerkung: Auch für leere Elemente wird das Ergeignispaar aus startElement und endElement erzeugt. |
| startPrefixMapping(String prefix, String uri) | Signalisiert den Beginn des Gültigkeitsbereits des Namensraumkürzels prefix. uri enthält die vollständige URI des gebundenen Namensraums. Ist prefix leer, so handelt es sich um die Redefinition des Vorgabenamensraums. Das Ereignis wird vor dem ersten Element des Namensraums (d.h. dem Element, das die Präfixbindung enthält oder den Vorgabenamensraum überschreibt) ausgelöst. |
| endPrefixMapping(String prefix) | Signalisiert das Ende des Gültigkeitsbereichs eines Namensraums. Ist der Übergabeparameter leer, so bezieht sich das Ereignis auf den Vorgabenamensraum. Das Ereignis tritt nach dem endElement-Ereignis des letzten Elements im Namensraum ein. |
| endDocument() | Wird als letztes Ereignis des Parsingvorganges ausgelöst. |
Python Dokumentation¶
In der Standard-Bibliothek ist die Unterstützung für SAX2 Parser enthalten und in der Bibliotheks Dokumentation beschrieben.
lxml¶
Eine weitere Python XML Bibliothek ist lxml. Diese ist eine stark auf Python ausgerichteter Wrapper um die C-XML-Bibliotheken libxml2 und libxslt.
lxml hat auch eine entsprechende SAX-Schnittstelle
SAX - einfache Beispiele¶
Erweiterung der bisherigen Kontakte-Struktur um einige zusätzliche Features
Dokument Type Definition kontakte.dtd¶
%%writefile kontakte.dtd
<!ELEMENT Kontakte (Kontakt*)>
<!ELEMENT Kontakt (Person, Kontaktdaten*, Notizzettel*)>
<!ATTLIST Kontakt
Markierung (wichtig|unwichtig|sonstiges) "sonstiges"
Typ CDATA #IMPLIED>
<!ELEMENT Person (Name?, Vorname+, Geburtsname?,
Titel*, Namenszusatz?)>
<!ATTLIST Person
Geschlecht (männlich|weiblich|sonstiges) "sonstiges"
Geburtstag CDATA #REQUIRED>
<!ELEMENT Name (#PCDATA)>
<!ELEMENT Vorname (#PCDATA)>
<!ELEMENT Geburtsname (#PCDATA)>
<!ELEMENT Titel (#PCDATA)>
<!ELEMENT Namenszusatz (#PCDATA)>
<!ELEMENT Adresse (Strasse?, Hausnummer?, Plz?, Ort?,
Land?, Zusatzinfo?, Postfach?)>
<!ELEMENT Strasse (#PCDATA)>
<!ELEMENT Hausnummer (#PCDATA)>
<!ELEMENT Plz (#PCDATA)>
<!ELEMENT Ort (#PCDATA)>
<!ELEMENT Land (#PCDATA)>
<!ELEMENT Zusatzinfo (#PCDATA)>
<!ELEMENT Postfach (#PCDATA)>
<!ELEMENT Kontaktdaten (Adresse?, Telefonnummer*, EMail*, Überschrift*)>
<!ATTLIST Kontaktdaten
Typ (privat|geschäftlich|sonstiges) "sonstiges">
<!ELEMENT Telefonnummer (#PCDATA)>
<!ATTLIST Telefonnummer
Typ (mobil|festnetz|sonstiges) "festnetz">
<!ELEMENT EMail (#PCDATA)>
<!ELEMENT Notizzettel (#PCDATA)>
<!ELEMENT Überschrift (#PCDATA)>
Overwriting kontakte.dtd
Beispiel eines dazugehörigen XML-Dokumentes kontakte.xml¶
%%writefile kontakte.xml
<?xml version="1.0"?>
<!DOCTYPE Kontakte SYSTEM "kontakte.dtd">
<Kontakte>
<Kontakt Typ="kein Freund" Markierung="unwichtig">
<Person Geschlecht="männlich"
Geburtstag="1.1.1970">
<Name>Mustermann</Name>
<Vorname>Max</Vorname>
<Geburtsname></Geburtsname>
<Titel>Lord</Titel>
<Namenszusatz></Namenszusatz>
</Person>
<Kontaktdaten Typ="geschäftlich">
<Adresse>
<Strasse>Unter der Brücke</Strasse>
<Hausnummer>10</Hausnummer>
<PLZ>86150</PLZ>
<Ort>Augsburg</Ort>
<Land>Bayern</Land>
<Zusatzinfo>Schwaben</Zusatzinfo>
<Postfach></Postfach>
</Adresse>
<Telefonnummer>123456789</Telefonnummer>
<Telefonnummer Typ="mobil">0190-987654321</Telefonnummer>
<EMail>Lord.Mustermann@hs-augsburg.de</EMail>
</Kontaktdaten>
<Kontaktdaten Typ="privat">
<Adresse>
<Strasse>Unter der Lechbrücke</Strasse>
<Hausnummer>2</Hausnummer>
<Plz>86150</Plz>
<Ort>Augsburg</Ort>
<Land>Bayern</Land>
<Zusatzinfo>Schwaben</Zusatzinfo>
<Postfach></Postfach>
</Adresse>
<Telefonnummer>567890</Telefonnummer>
<Telefonnummer Typ="mobil">0160-23456790</Telefonnummer>
<EMail>Lord.Mustermann@web.de</EMail>
<Notizzettel>stinkt ein bißchen</Notizzettel>
</Kontaktdaten>
<Notizzettel></Notizzettel>
</Kontakt>
<Kontakt Typ="Freund" Markierung="wichtig">
<Person Geschlecht="männlich"
Geburtstag="1.1.1990">
<Name>Lehmann</Name>
<Vorname>Moritz</Vorname>
<Geburtsname></Geburtsname>
<Titel> </Titel>
<Namenszusatz></Namenszusatz>
</Person>
<Kontaktdaten Typ="geschäftlich">
<Adresse>
<Strasse>Friedberger Str.</Strasse>
<Hausnummer>2</Hausnummer>
<Plz>86161</Plz>
<Ort>Augsburg</Ort>
<Land>Bayern</Land>
<Zusatzinfo>Schwaben</Zusatzinfo>
<Postfach></Postfach>
</Adresse>
<Telefonnummer>5586-7900</Telefonnummer>
<Telefonnummer Typ="mobil">0170-987654321</Telefonnummer>
<EMail>Moritz.Lehmann@hs-augsburg.de</EMail>
</Kontaktdaten>
<Kontaktdaten Typ="privat">
<Adresse>
<Strasse>Badstrasse</Strasse>
<Hausnummer>20</Hausnummer>
<Plz>86150</Plz>
<Ort>Augsburg</Ort>
<Land>Bayern</Land>
<Zusatzinfo>Schwaben</Zusatzinfo>
<Postfach></Postfach>
</Adresse>
<Telefonnummer>8976890</Telefonnummer>
<Telefonnummer Typ="mobil">0161-12342345</Telefonnummer>
<EMail>m.lehmann@web.de</EMail>
<Überschrift>ÄÖüß</Überschrift>
</Kontaktdaten>
<Notizzettel></Notizzettel>
</Kontakt>
</Kontakte>
Overwriting kontakte.xml
#! /usr/bin/python
# -*- coding: utf-8 -*-
from xml.sax import make_parser, handler, SAXException, SAXParseException
class SAXBeispiel1(handler.ContentHandler):
def __init__(self):
pass
def startDocument(self):
print("document started")
def endDocument(self):
print("document ended")
parser = make_parser()
instanz = SAXBeispiel1()
parser.setContentHandler(instanz)
parser.parse('kontakte.xml')
document started document ended
from xml.sax import make_parser, handler, SAXException, SAXParseException
class SAXBeispiel2(handler.ContentHandler):
def __init__(self):
self.xmldokument = ""
def startDocument(self):
self.xmldokument += "<?xml version='1.0'?>\n"
def endDocument(self):
print(self.xmldokument)
def startElement(self, name, attrs):
self.xmldokument += "<{}".format(name) # Beginn der Ausgabe des Elements
for attr in attrs.getNames():
self.xmldokument += ' {}="{}"'.format(attr,attrs.getValue(attr))
self.xmldokument += ">"
def characters(self, content):
self.xmldokument += content
def endElement(self, name):
self.xmldokument += "</{}>".format(name)
parser = make_parser()
parser.setContentHandler(SAXBeispiel2())
parser.parse('kontakte.xml')
<?xml version='1.0'?>
<Kontakte>
<Kontakt Typ="kein Freund" Markierung="unwichtig">
<Person Geschlecht="männlich" Geburtstag="1.1.1970">
<Name>Mustermann</Name>
<Vorname>Max</Vorname>
<Geburtsname></Geburtsname>
<Titel>Lord</Titel>
<Namenszusatz></Namenszusatz>
</Person>
<Kontaktdaten Typ="geschäftlich">
<Adresse>
<Strasse>Unter der Brücke</Strasse>
<Hausnummer>10</Hausnummer>
<PLZ>86150</PLZ>
<Ort>Augsburg</Ort>
<Land>Bayern</Land>
<Zusatzinfo>Schwaben</Zusatzinfo>
<Postfach></Postfach>
</Adresse>
<Telefonnummer Typ="festnetz">123456789</Telefonnummer>
<Telefonnummer Typ="mobil">0190-987654321</Telefonnummer>
<EMail>Lord.Mustermann@hs-augsburg.de</EMail>
</Kontaktdaten>
<Kontaktdaten Typ="privat">
<Adresse>
<Strasse>Unter der Lechbrücke</Strasse>
<Hausnummer>2</Hausnummer>
<Plz>86150</Plz>
<Ort>Augsburg</Ort>
<Land>Bayern</Land>
<Zusatzinfo>Schwaben</Zusatzinfo>
<Postfach></Postfach>
</Adresse>
<Telefonnummer Typ="festnetz">567890</Telefonnummer>
<Telefonnummer Typ="mobil">0160-23456790</Telefonnummer>
<EMail>Lord.Mustermann@web.de</EMail>
<Notizzettel>stinkt ein bißchen</Notizzettel>
</Kontaktdaten>
<Notizzettel></Notizzettel>
</Kontakt>
<Kontakt Typ="Freund" Markierung="wichtig">
<Person Geschlecht="männlich" Geburtstag="1.1.1990">
<Name>Lehmann</Name>
<Vorname>Moritz</Vorname>
<Geburtsname></Geburtsname>
<Titel> </Titel>
<Namenszusatz></Namenszusatz>
</Person>
<Kontaktdaten Typ="geschäftlich">
<Adresse>
<Strasse>Friedberger Str.</Strasse>
<Hausnummer>2</Hausnummer>
<Plz>86161</Plz>
<Ort>Augsburg</Ort>
<Land>Bayern</Land>
<Zusatzinfo>Schwaben</Zusatzinfo>
<Postfach></Postfach>
</Adresse>
<Telefonnummer Typ="festnetz">5586-7900</Telefonnummer>
<Telefonnummer Typ="mobil">0170-987654321</Telefonnummer>
<EMail>Moritz.Lehmann@hs-augsburg.de</EMail>
</Kontaktdaten>
<Kontaktdaten Typ="privat">
<Adresse>
<Strasse>Badstrasse</Strasse>
<Hausnummer>20</Hausnummer>
<Plz>86150</Plz>
<Ort>Augsburg</Ort>
<Land>Bayern</Land>
<Zusatzinfo>Schwaben</Zusatzinfo>
<Postfach></Postfach>
</Adresse>
<Telefonnummer Typ="festnetz">8976890</Telefonnummer>
<Telefonnummer Typ="mobil">0161-12342345</Telefonnummer>
<EMail>m.lehmann@web.de</EMail>
<Überschrift>ÄÖüß</Überschrift>
</Kontaktdaten>
<Notizzettel></Notizzettel>
</Kontakt>
</Kontakte>
from xml.sax import make_parser, handler, SAXException, SAXParseException
class SAXBeispiel3(handler.ContentHandler):
def __init__(self, alterName, neuerName):
self.xmldokument = ""
self.alterName = alterName
self.neuerName = neuerName
def startDocument(self):
self.xmldokument += "<?xml version='1.0'?>\n"
def endDocument(self):
print(self.xmldokument)
def startElement(self, name, attrs):
if name == self.alterName:
name = self.neuerName
self.xmldokument += "<{}".format(name) # Beginn der Ausgabe des Elements
for attr in attrs.getNames():
self.xmldokument += ' {}="{}"'.format(attr,attrs.getValue(attr))
self.xmldokument += ">"
def characters(self, content):
self.xmldokument += content
def endElement(self, name):
if name == self.alterName:
name = self.neuerName
self.xmldokument += "</{}>".format(name)
parser = make_parser()
parser.setContentHandler(SAXBeispiel3('Notizzettel','Notiz'))
parser.parse('kontakte.xml')
<?xml version='1.0'?>
<Kontakte>
<Kontakt Typ="kein Freund" Markierung="unwichtig">
<Person Geschlecht="männlich" Geburtstag="1.1.1970">
<Name>Mustermann</Name>
<Vorname>Max</Vorname>
<Geburtsname></Geburtsname>
<Titel>Lord</Titel>
<Namenszusatz></Namenszusatz>
</Person>
<Kontaktdaten Typ="geschäftlich">
<Adresse>
<Strasse>Unter der Brücke</Strasse>
<Hausnummer>10</Hausnummer>
<PLZ>86150</PLZ>
<Ort>Augsburg</Ort>
<Land>Bayern</Land>
<Zusatzinfo>Schwaben</Zusatzinfo>
<Postfach></Postfach>
</Adresse>
<Telefonnummer Typ="festnetz">123456789</Telefonnummer>
<Telefonnummer Typ="mobil">0190-987654321</Telefonnummer>
<EMail>Lord.Mustermann@hs-augsburg.de</EMail>
</Kontaktdaten>
<Kontaktdaten Typ="privat">
<Adresse>
<Strasse>Unter der Lechbrücke</Strasse>
<Hausnummer>2</Hausnummer>
<Plz>86150</Plz>
<Ort>Augsburg</Ort>
<Land>Bayern</Land>
<Zusatzinfo>Schwaben</Zusatzinfo>
<Postfach></Postfach>
</Adresse>
<Telefonnummer Typ="festnetz">567890</Telefonnummer>
<Telefonnummer Typ="mobil">0160-23456790</Telefonnummer>
<EMail>Lord.Mustermann@web.de</EMail>
<Notiz>stinkt ein bißchen</Notiz>
</Kontaktdaten>
<Notiz></Notiz>
</Kontakt>
<Kontakt Typ="Freund" Markierung="wichtig">
<Person Geschlecht="männlich" Geburtstag="1.1.1990">
<Name>Lehmann</Name>
<Vorname>Moritz</Vorname>
<Geburtsname></Geburtsname>
<Titel> </Titel>
<Namenszusatz></Namenszusatz>
</Person>
<Kontaktdaten Typ="geschäftlich">
<Adresse>
<Strasse>Friedberger Str.</Strasse>
<Hausnummer>2</Hausnummer>
<Plz>86161</Plz>
<Ort>Augsburg</Ort>
<Land>Bayern</Land>
<Zusatzinfo>Schwaben</Zusatzinfo>
<Postfach></Postfach>
</Adresse>
<Telefonnummer Typ="festnetz">5586-7900</Telefonnummer>
<Telefonnummer Typ="mobil">0170-987654321</Telefonnummer>
<EMail>Moritz.Lehmann@hs-augsburg.de</EMail>
</Kontaktdaten>
<Kontaktdaten Typ="privat">
<Adresse>
<Strasse>Badstrasse</Strasse>
<Hausnummer>20</Hausnummer>
<Plz>86150</Plz>
<Ort>Augsburg</Ort>
<Land>Bayern</Land>
<Zusatzinfo>Schwaben</Zusatzinfo>
<Postfach></Postfach>
</Adresse>
<Telefonnummer Typ="festnetz">8976890</Telefonnummer>
<Telefonnummer Typ="mobil">0161-12342345</Telefonnummer>
<EMail>m.lehmann@web.de</EMail>
<Überschrift>ÄÖüß</Überschrift>
</Kontaktdaten>
<Notiz></Notiz>
</Kontakt>
</Kontakte>
from xml.sax import make_parser, handler, SAXException, SAXParseException
class SAXBeispiel4(handler.ContentHandler):
def __init__(self, tagName, neuerContent):
self.xmldokument = ""
self.tagName = tagName
self.neuerContent = neuerContent
self.aktuellerName = ''
pass
def startDocument(self):
self.xmldokument += "<?xml version='1.0'?>\n"
def endDocument(self):
print(self.xmldokument)
def startElement(self, name, attrs):
self.aktuellerName = name
self.xmldokument += "<{}".format(name) # Beginn der Ausgabe des Elements
for attr in attrs.getNames():
self.xmldokument += ' {}="{}"'.format(attr,attrs.getValue(attr))
self.xmldokument += ">"
def characters(self, content):
if self.aktuellerName == self.tagName:
self.xmldokument += self.neuerContent
else:
self.xmldokument += content
def endElement(self, name):
self.aktuellerName = ''
self.xmldokument += "</{}>".format(name)
parser = make_parser()
parser.setContentHandler(SAXBeispiel4('Titel','Earl'))
parser.parse('kontakte.xml')
<?xml version='1.0'?>
<Kontakte>
<Kontakt Typ="kein Freund" Markierung="unwichtig">
<Person Geschlecht="männlich" Geburtstag="1.1.1970">
<Name>Mustermann</Name>
<Vorname>Max</Vorname>
<Geburtsname></Geburtsname>
<Titel>Earl</Titel>
<Namenszusatz></Namenszusatz>
</Person>
<Kontaktdaten Typ="geschäftlich">
<Adresse>
<Strasse>Unter der Brücke</Strasse>
<Hausnummer>10</Hausnummer>
<PLZ>86150</PLZ>
<Ort>Augsburg</Ort>
<Land>Bayern</Land>
<Zusatzinfo>Schwaben</Zusatzinfo>
<Postfach></Postfach>
</Adresse>
<Telefonnummer Typ="festnetz">123456789</Telefonnummer>
<Telefonnummer Typ="mobil">0190-987654321</Telefonnummer>
<EMail>Lord.Mustermann@hs-augsburg.de</EMail>
</Kontaktdaten>
<Kontaktdaten Typ="privat">
<Adresse>
<Strasse>Unter der Lechbrücke</Strasse>
<Hausnummer>2</Hausnummer>
<Plz>86150</Plz>
<Ort>Augsburg</Ort>
<Land>Bayern</Land>
<Zusatzinfo>Schwaben</Zusatzinfo>
<Postfach></Postfach>
</Adresse>
<Telefonnummer Typ="festnetz">567890</Telefonnummer>
<Telefonnummer Typ="mobil">0160-23456790</Telefonnummer>
<EMail>Lord.Mustermann@web.de</EMail>
<Notizzettel>stinkt ein bißchen</Notizzettel>
</Kontaktdaten>
<Notizzettel></Notizzettel>
</Kontakt>
<Kontakt Typ="Freund" Markierung="wichtig">
<Person Geschlecht="männlich" Geburtstag="1.1.1990">
<Name>Lehmann</Name>
<Vorname>Moritz</Vorname>
<Geburtsname></Geburtsname>
<Titel>Earl</Titel>
<Namenszusatz></Namenszusatz>
</Person>
<Kontaktdaten Typ="geschäftlich">
<Adresse>
<Strasse>Friedberger Str.</Strasse>
<Hausnummer>2</Hausnummer>
<Plz>86161</Plz>
<Ort>Augsburg</Ort>
<Land>Bayern</Land>
<Zusatzinfo>Schwaben</Zusatzinfo>
<Postfach></Postfach>
</Adresse>
<Telefonnummer Typ="festnetz">5586-7900</Telefonnummer>
<Telefonnummer Typ="mobil">0170-987654321</Telefonnummer>
<EMail>Moritz.Lehmann@hs-augsburg.de</EMail>
</Kontaktdaten>
<Kontaktdaten Typ="privat">
<Adresse>
<Strasse>Badstrasse</Strasse>
<Hausnummer>20</Hausnummer>
<Plz>86150</Plz>
<Ort>Augsburg</Ort>
<Land>Bayern</Land>
<Zusatzinfo>Schwaben</Zusatzinfo>
<Postfach></Postfach>
</Adresse>
<Telefonnummer Typ="festnetz">8976890</Telefonnummer>
<Telefonnummer Typ="mobil">0161-12342345</Telefonnummer>
<EMail>m.lehmann@web.de</EMail>
<Überschrift>ÄÖüß</Überschrift>
</Kontaktdaten>
<Notizzettel></Notizzettel>
</Kontakt>
</Kontakte>
from xml.sax import make_parser, handler, SAXException, SAXParseException
class SAXBeispiel4(handler.ContentHandler):
def __init__(self, tagName, alterContent, neuerContent):
self.xmldokument = ""
self.tagName = tagName
self.alterContent = alterContent
self.neuerContent = neuerContent
self.aktuellerName = ''
def startDocument(self):
self.xmldokument += "<?xml version='1.0'?>\n"
def endDocument(self):
print(self.xmldokument)
def startElement(self, name, attrs):
self.aktuellerName = name
self.xmldokument += "<{}".format(name) # Beginn der Ausgabe des Elements
for attr in attrs.getNames():
self.xmldokument += ' {}="{}"'.format(attr,attrs.getValue(attr))
self.xmldokument += ">"
def characters(self, content):
if self.aktuellerName == self.tagName:
if content == self.alterContent:
self.xmldokument += self.neuerContent
else:
self.xmldokument += content
else:
self.xmldokument += content
def endElement(self, name):
self.aktuellerName = ''
self.xmldokument += "</{}>".format(name)
parser = make_parser()
parser.setContentHandler(SAXBeispiel4('Titel','Lord','Earl'))
parser.parse('kontakte.xml')
<?xml version='1.0'?>
<Kontakte>
<Kontakt Typ="kein Freund" Markierung="unwichtig">
<Person Geschlecht="männlich" Geburtstag="1.1.1970">
<Name>Mustermann</Name>
<Vorname>Max</Vorname>
<Geburtsname></Geburtsname>
<Titel>Earl</Titel>
<Namenszusatz></Namenszusatz>
</Person>
<Kontaktdaten Typ="geschäftlich">
<Adresse>
<Strasse>Unter der Brücke</Strasse>
<Hausnummer>10</Hausnummer>
<PLZ>86150</PLZ>
<Ort>Augsburg</Ort>
<Land>Bayern</Land>
<Zusatzinfo>Schwaben</Zusatzinfo>
<Postfach></Postfach>
</Adresse>
<Telefonnummer Typ="festnetz">123456789</Telefonnummer>
<Telefonnummer Typ="mobil">0190-987654321</Telefonnummer>
<EMail>Lord.Mustermann@hs-augsburg.de</EMail>
</Kontaktdaten>
<Kontaktdaten Typ="privat">
<Adresse>
<Strasse>Unter der Lechbrücke</Strasse>
<Hausnummer>2</Hausnummer>
<Plz>86150</Plz>
<Ort>Augsburg</Ort>
<Land>Bayern</Land>
<Zusatzinfo>Schwaben</Zusatzinfo>
<Postfach></Postfach>
</Adresse>
<Telefonnummer Typ="festnetz">567890</Telefonnummer>
<Telefonnummer Typ="mobil">0160-23456790</Telefonnummer>
<EMail>Lord.Mustermann@web.de</EMail>
<Notizzettel>stinkt ein bißchen</Notizzettel>
</Kontaktdaten>
<Notizzettel></Notizzettel>
</Kontakt>
<Kontakt Typ="Freund" Markierung="wichtig">
<Person Geschlecht="männlich" Geburtstag="1.1.1990">
<Name>Lehmann</Name>
<Vorname>Moritz</Vorname>
<Geburtsname></Geburtsname>
<Titel> </Titel>
<Namenszusatz></Namenszusatz>
</Person>
<Kontaktdaten Typ="geschäftlich">
<Adresse>
<Strasse>Friedberger Str.</Strasse>
<Hausnummer>2</Hausnummer>
<Plz>86161</Plz>
<Ort>Augsburg</Ort>
<Land>Bayern</Land>
<Zusatzinfo>Schwaben</Zusatzinfo>
<Postfach></Postfach>
</Adresse>
<Telefonnummer Typ="festnetz">5586-7900</Telefonnummer>
<Telefonnummer Typ="mobil">0170-987654321</Telefonnummer>
<EMail>Moritz.Lehmann@hs-augsburg.de</EMail>
</Kontaktdaten>
<Kontaktdaten Typ="privat">
<Adresse>
<Strasse>Badstrasse</Strasse>
<Hausnummer>20</Hausnummer>
<Plz>86150</Plz>
<Ort>Augsburg</Ort>
<Land>Bayern</Land>
<Zusatzinfo>Schwaben</Zusatzinfo>
<Postfach></Postfach>
</Adresse>
<Telefonnummer Typ="festnetz">8976890</Telefonnummer>
<Telefonnummer Typ="mobil">0161-12342345</Telefonnummer>
<EMail>m.lehmann@web.de</EMail>
<Überschrift>ÄÖüß</Überschrift>
</Kontaktdaten>
<Notizzettel></Notizzettel>
</Kontakt>
</Kontakte>