XML-Parser
Manuel Röllinghoff
Übersicht
• Einleitung
• Parsereigenschaften
• SAX
• DOM
• Beschreibung der wichtigsten Java-Parser
• Parsergeneratoren
Einleitung
• Große Anzahl von XML-Parsern für fast alle Programmier- und Skriptsprachen erhältlich.
• Unterstützung von Standards unterschiedlich.
• Java und XML
Einleitung
• Wo werden XML-Parser eingesetzt?
• Ein Beispiel:
Parserarten
• Zwei Parserarten:
• Nicht-validierende Parser: überprüfen nur, ob das Dokument wohlgeformt ist
• Validierende Parser: überprüfen zusätzlich, ob das Dokument sich an die vorgegebene DTD hält
Wohlgeformtheit
• Alle Attributwerte müssen in Anführungsstrichen stehen
• Jedes Tag muss ein Ende-Tag besitzen ( <br></br> ) oder mit einem "/" gleich beendet werden ( <br/> )
• Elemente müssen sauber ineinander eingebettet sein ( nicht <sprache> <deutsch> </sprache> </deutsch> )
• Der Name eines Attributs kommt innerhalb eines Elements nicht mehr als einmal vor
• Ein Attributwert darf keinen Verweis auf ein externes Entity enthalten
• Ein Attributwert darf kein "<" enthalten
SAX
• Simple API for XML
• entwickelt von der XML-DEV Mailinglist
• 1998 Version 1.0, inzwischen Version 2.0
• serieller Mechanismus zur Verarbeitung von XML-Dokumenten
• ereignisgesteuertes Protokoll(Handler)
SAX
• Parser über ParserFactory instanzieren
• Handler implementieren und beim Parser registrieren
• Parser.parse() aufrufen
SAX
• startDocument()
• endDocument()
• startElement()
• endElement()
• characters()
• ignorableWhitespace()
• processingInstruction()
• setDocumentLocator()
DocumentHandler
SAX
SAX
• warning()
• error()
• fatalError()
ErrorHandler
SAX
SAX
• resolveEntity()
• unparsedEntityDecl()
• notationDecl()
Entity Resolver
DTDHandler
SAX 1.0 => SAX 2.0
• Unterstützung von XML-Namespaces
• einheitliche Schnittstelle zum Lesen und Schreiben von Properties und Features
• Interface XMLFilter um Filter zwischen Anwendung und SAX-Treiber einzusetzen
• neue Namen für Interfaces: XMLReader für Parser, ContentHandler für DocumentHandler u.v.m.
Whitespace I
• Leerzeichen, Tabs, Zeilenschaltung u.ä. zwischen Tags um Quelltext lesbarer zu machen
• nicht signifikant, kann nur mit Hilfe der DTD erkannt werden
• wird in Methode ignorableWhitespace() des DocumentHandlers weitergegeben
• bei nichtvalidierenden Parsern unterschiedliche Behandlung
Whitespace II
• signifikant, z.B. Zeilenenden bei Quelltext, mehrere Leerzeichen zwischen Wörtern
• keine Möglichkeit für den Parser, die Signifikanz zu erkennen
• Lösung: entweder das Attribut xml:space="preserve" setzen oder die Daten in einem CDATA-Abschnitt kapseln
DOM
• Document Object Model
• Standard vom W3C
• 1998 DOM Level 1, DOM Level 2 Proposed Recommendation
• Das DOM definiert mehrere Interfaces mit denen Daten in einer Baumstruktur beschrieben werden können.
DOM
nodeNameparentNodechildNodes...
getNodeName()getParentNode()getChildNodes()...
Node
datalength
CharacterData
Text
CDATASection
namevalue
Attr
doctype
Document
tagname
Element ...
DOM
• Alle Knoten von Node abgeleitet
• Funktionalität zum Traversieren des Baumes in Node
• spezifische Eigenschaften in abgeleiteten Klassen
• weitere Interfaces für Notation, Entity, EntityReference, ProcessingInstruction
DOM
<?xml version="1.0"?><!--DOM Demo--><xdoc> <Begruessung>Hallo <laut>XML</laut> Parser! </Begruessung> <Applaus art="anhaltend"/></xdoc>
Document
CommentVersion Element
Element Element
TextText Element
Text
• Beispiel:
DOM und XML-Parser
• Die meisten Parser unterstützen ausschließlich DOM Level 1.0
• DOM Level 1.0 spezifiziert nur, wie man mit dem DOM arbeiten kann, nicht wie ein DOM aus einem XML-Dokument erzeugt werden kann
• Unterschiedliche Implementierungen zumeist auf Grundlage von SAX
DOM und XML-Parser
• Beispiel JAXP von Sun:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();try { factory.setValidating(true); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse( new File(argv[0]) );} catch (SAXParseException spe) { ... Fehlerbehandlung ausgeschnitten ...}
DOM
• Achtung: DOM wird komplett im Hauptspeicher gehalten
• Bei Verarbeitung von großen Dokumenten mit wenig Arbeitsspeicher Performanceverlust wegen Auslagerung des Speichers
XML-Parser in Java
• JAXP und Project X (Sun)
• Xerces-J (Apache)
• XP (James Clark)
• XML Parser v2 (Oracle)
JAXP
• Java API for XML Parsing
• stellt Schnittstellen zum Parsen und Manipulieren von XML-Dokumenten zur Verfügung
• zusammen mit Project X als Referenzimplementation eines Parsers
• Java Optional Package mit Paketnamen javax.xml.parsers
• Standarderweiterung des JDK, wird aber noch nicht zusammen damit ausgeliefert
JAXP
• Interfaces:
– SAXParserFactory
– SAXParser
– DocumentBuilderFactory
– DocumentBuilder
– FactoryConfigurationError
– ParserConfigurationException
JAXP
• Voraussetzungen, um einen Parser in das JAXP-Interface "pluggen" zu können:
– Er muß als character set encodings mindestens ascii, UTF8 und UTF16 unterstützen
– Er muß ein Dokument auf seine Wohlgeformtheit überprüfen können
– Er muß ein Dokument auf seine Gültigkeit anhand einer DTD überprüfen können
JAXP - Project X
• Project X 1998 als Technology Release 1
• 1999 Technology Release 2
• 2000 Referenzimplementation für JAXP
• erster schneller Parser
• validierender und nichtvalidierender Parser
• Unterstützung von SAX 1.0, DOM Level 1.0 und XML Namespaces
• nicht open source, aber Community Source License
JAXP - Project X
• Vorteile:
– hohe Konformität zum XML-Standard
– hohe Geschwindigkeit
– gute Dokumentation ( Tutorial, Beispiele, source code )
Xerces-J
• xml.apache.org Projekt
• entstanden aus dem IBM XML4J
• XML4J gibt es weiterhin und baut auf Xerces-J auf
• aktuelle Version 1.2.1
• bietet validierende und nichtvalidierende Parser
• unterstützt SAX 1.0 und 2.0, DOM Level 1, DOM Level 2 beta
• ansatzweise Unterstützung von XML-Schema
Xerces-J
• open source
• gute Dokumentation
• Achtung: Dieser Parser liest eine DTD, auch wenn er im nicht-validierenden Modus ist
XP
• Autor James Clark: Technical Editor der XML-Spezifikation
• zwei Designziele: 100% konform zum XML-Standard und möglichst schnell
• dafür Einschränkungen: – kein validierender Parser,
– Unterstützung nur von SAX 1.0
– keine DOM-Unterstützung
– nur 4 character encodings
– ErrorHandling "brutal"
XP
• Dokumentation nur API-Doc
• open source
XML Parser v2 (Oracle)
• validierende und nichtvalidierende Parser
• Unterstützung von SAX 1.0 und DOM Level 1.0
• Besonderheit: XSLT Modul, mit dem sich XML mittels eines Stylesheets in HTML oder ein anderes Format umwandeln läßt.
• Java Beans Komponenten(DOMBuilderBean, TreeViewBean, XSLBean)
• kein open source, kein source code
• Beispiele + API-Dokumentation
Parsergenerator XMLBooster
• generiert XML-Parser für vorher definierte Datenstrukturen in Java, C, C++, Cobol und Delphi
• Zunächst Meta-Definition (proprietäres Format, DTD-ähnlich) für das benötigte XML-Format erstellen
• Dann Parser generieren lassen und in eigene Anwendung integrieren
• Falls ein geparstes Dokument nicht dem Format genügt, wird Fehlermeldung ausgegeben, ansonsten erhält man die in der Meta-Definition beschriebene Datenstruktur mit Inhalt zurück.
Parsergenerator XMLBooster
• Vorteile:
– Geschwindigkeit
– Daten gleich in eigener Datenstruktur verfügbar
• Nachteile:
– proprietäre Meta-Definition
– nicht frei verfügbar
Ende
• Noch Fragen?