XML-Parser Manuel Röllinghoff

Download Report

Transcript XML-Parser Manuel Röllinghoff

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 Programmierund 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 XMLDokumenten
• 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
SAX
ErrorHandler
• warning()
• error()
• fatalError()
SAX
SAX
Entity Resolver
• resolveEntity()
DTDHandler
• unparsedEntityDecl()
• notationDecl()
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
Node
nodeName
parentNode
childNodes
...
getNodeName()
getParentNode()
getChildNodes()
...
CharacterData
data
length
Attr
name
value
Text
CDATASection
Document
doctype
Element
tagname
...
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>
Document
Version
Comment
Text
Element
Element
Element
Element
Text
Text
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 XMLDokument 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 XMLSpezifikation
• 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?