370 likes | 578 Views
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.
E N D
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 DocumentHandler • startDocument() • endDocument() • startElement() • endElement() • characters() • ignorableWhitespace() • processingInstruction() • setDocumentLocator()
SAX ErrorHandler • warning() • error() • fatalError()
SAX Entity Resolver • resolveEntity() • unparsedEntityDecl() • notationDecl() 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 • 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 • Beispiel: <?xml version="1.0"?> <!--DOM Demo--> <xdoc> <Begruessung>Hallo <laut>XML</laut> Parser! </Begruessung> <Applaus art="anhaltend"/> </xdoc>
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?