Parsing and Querying XML Documents in SML
Total Page:16
File Type:pdf, Size:1020Kb
Parsing and Querying XML Documents in SML Dissertation zur Erlangung des akademischen Grades des Doktors der Naturwissenschaften am Fachbereich IV der Universitat¨ Trier vorgelegt von Diplom-Informatiker Andreas Neumann Dezember 1999 The forest walks are wide and spacious; And many unfrequented plots there are. The Moor Aaron, in1: The Tragedy of Titus Andronicus by William Shakespeare Danksagung An dieser Stelle mochte¨ ich allen Personen danken, die mich bei der Erstellung meiner Arbeit direkt oder indirekt unterstutzt¨ haben. An erster Stelle gilt mein Dank dem Betreuer meiner Arbeit, Helmut Seidl. In zahlreichen Diskussionen hatte er stets die Zeit und Geduld, sich mit meinen Vorstellungen von Baumautomaten auseinanderzusetzen. Seine umfassendes Hintergrundwissen und die konstruktive Kritik, die er ausubte,¨ haben wesent- lich zum Gelingen der Arbeit beigetragen. Besonderer Dank gilt Steven Bashford und Craig Smith fur¨ das muhevol-¨ le und aufmerksame Korrekturlesen der Arbeit. Sie haben manche Unstim- migkeit aufgedeckt und nicht wenige all zu “deutsche” Formulierungen in meinem Englisch gefunden. Allen Mitarbeitern des Lehrstuhls fur¨ Program- miersprachen und Ubersetzerbau¨ an der Universitat¨ Trier sei hiermit auch fur¨ die gute Arbeitsatmosphare¨ ein Lob ausgesprochen, die gewiss nicht an jedem Lehrstuhl selbstverstandlich¨ ist. Nicht zuletzt danke ich meiner Freundin Dagmar, die in den letzten Mo- naten viel Geduld und Verstandnis¨ fur¨ meine haufige¨ – nicht nur korperliche¨ – Abwesenheit aufbrachte. Ihre Unterstutzung¨ und Ermutigungen so wie ihr stets offenes Ohr waren von unschatzbarem¨ Wert. 1Found with fxgrep using the pattern ==SPEECH[ (==”forest”) ] in titus.xml [Bos99] Abstract The Extensible Markup Language (XML) is a language for storing and exchang- ing structured data in a sequential format. Though originally designed for the use in document processing, it is by now employed for representation of data in virtually all areas of computing, especially on the Internet. The basis of all XML processing software is an XML parser, which parses a document in XML syntax and exposes it as a document tree to the applica- tion. Document processing then basically reduces to tree manipulation. Mod- ern functional programming languages like SML and HASKELL with their tree- structured data-types are therefore well-suited for implementing such applica- tions. Nonetheless, the area of XML processing software is dominated by JAVA. Functional programming languages play a minor role, partly due to the lack of a complete implementation of an XML parser. One of the most important tasks in document processing is querying, that is the extraction of parts of a document that match a structural condition and are in a specific context. Due to the tree-like view of documents, querying XML can be implemented with techniques from tree language and automata theory. These techniques must, however, be adapted to the needs of XML. One spe- cific requirement is that even extremely large documents must be processed. It must therefore be possible to perform the querying algorithm in a single pass through the document, without the need of constructing a copy of the docu- ment tree in memory. This work is divided into two parts: The first part presents fxp, an XML parser written completely in SML. We describe the implementation of fxp and discuss our experiences with SML. We analyze the run-time behavior of fxp and com- pare it to XML parsers written in imperative and object-oriented programming languages. The second part presents an XML querying algorithm based on forest au- tomata theory. The algorithm locates all matches of a query in at most two passes through the document. For an important subclass of queries even a sin- gle run suffices. Moreover, we discuss the implementation of the algorithm based on fxp. For each of the two parts a separate, more detailed introduction is given. v Zusammenfassung XML (Extensible Markup Language) ist ein sequentielles Format zur Speiche- rung und Ubermittlung¨ strukturierter Daten. Obwohl es ursprunglich¨ fur¨ die Dokumentenverarbeitung entwickelt wurde, findet XML heute Verwendung in nahezu allen Bereichen der Datenverarbeitung, insbesondere aber im Internet. Jede XML-Dokumentenverarbeitungs-Software basiert auf einem XML- Parser. Der Parser liest ein Dokument in XML-Syntax ein und stellt es als Dokumentbaum der eigentlichen Anwendung zur Verfugung.¨ Dokumenten- verarbeitung ist dann im wesentlichen die Manipulation von Baumen.¨ Mo- derne funktionale Programmiersprachen wie SML und HASKELL unterstutzen¨ Baume¨ als Basis-Datentypen und sind daher besonders gut fur¨ die Implemen- tierung von Dokumentenverarbeitungs-Systemen geeignet. Um so erstaunli- cher ist es, dass dieser Bereich zum großten¨ Teil von JAVA-Software dominiert wird. Dies ist nicht zuletzt darauf zuruckzuf¨ uhren,¨ dass noch keine vollstandi-¨ ge Implementierung der XML-Syntax als Parser in einer funktionalen Program- miersprache vorliegt. Eine der wichtigsten Aufgaben in der Dokumentenverarbeitung ist Query- ing, d.h. die Lokalisierung von Teildokumenten, die eine angegebene Struktur- bedingung erfullen¨ und in einem bestimmten Kontext stehen. Die baumartige Auffassung von Dokumenten in XML erlaubt die Realisierung des Querying mithilfe von Techniken aus der Theorie der Baumsprachen und Baumauto- maten. Allerdings mussen¨ diese Techniken an die speziellen Anforderungen von XML angepasst werden. Eine dieser Anforderungen ist, dass auch extrem große Dokumente verarbeitet werden mussen.¨ Deshalb sollte der Querying- Algorithmus in einem einzigen Durchlauf durch das Dokument ausfuhrbar¨ sein, ohne den Dokumentbaum explizit im Speicher aufbauen zu mussen.¨ Diese Arbeit besteht aus zwei Teilen. Der erste Teil beschreibt den XML-Parser fxp, der vollstandig¨ in SML programmiert wurde. Insbesondere werden die Erfahrungen mit SML diskutiert, die wahrend¨ der Implementierung von fxp gewonnen wurden. Es folgt eine Analyse des Laufzeit-Verhaltens von fxp und ein Vergleich mit anderen XML-Parsern, die in imperativen oder objekt- orientierten Programmiersprachen entwickelt wurden. Im zweiten Teil beschreiben wir einen Algorithmus zum Querying von XML-Dokumenten, der auf der Theorie der Waldautomaten fundiert ist. Er findet alle Treffer einer Anfrage in hochstens¨ zwei Durchlaufen¨ durch das Do- kument. Fur¨ eine wichtige Teilklasse von Anfragen kann das Querying sogar in einem einzelnen Durchlauf realisiert werden. Außerdem wird die Imple- mentierung des Algorithmus in SML mit Hilfe von fxp dargestellt. vi Contents I An XML Parser Written in SML 1 Introduction 3 Einf ¨uhrung 4 1 Document Processing with XML 6 1.1 Introduction to XML ......................... 6 1.1.1 Elements, Attributes, and the Document Type . 7 1.1.2 Entities . 9 1.1.3 Public Identifiers and Catalogs . 10 1.1.4 Miscellaneous Markup . 11 1.1.5 UNICODE ........................... 12 1.1.6 Well-Formedness, Validity and Compatibility . 12 1.2 XML Software . 13 1.2.1 Areas of XML Processing . 15 1.2.2 Commercial software . 16 1.2.3 XML Application Interfaces . 16 1.2.4 The Information Set . 17 1.2.5 Further Characteristics of XML Parsers . 18 1.2.6 Existing XML Parsers . 19 2 Implementation of fxp 21 2.1 The Implementation Language – SML . 21 2.2 System Architecture . 23 2.3 The UNICODE Frontend . 24 2.3.1 Basic Types . 26 2.3.2 Character Classes . 28 2.3.3 Access to the File System and the Network . 29 2.3.4 Byte-Stream Operations . 31 2.3.5 Decoding into UNICODE ................... 32 2.3.6 Representing Encoded Files . 34 2.3.7 Auto-Detection of Character Encodings . 36 2.4 Errors and Options . 37 2.5 The Entity Manager . 39 2.5.1 Internal Entities . 39 2.5.2 External Entities . 40 2.5.3 Implementing Look-Ahead . 42 2.5.4 Other Important Entity Manager Functions . 43 2.6 The DTD Manager . 44 vii viii CONTENTS 2.6.1 Dynamic Dictionaries . 45 2.6.2 Data Types for Declarations . 46 2.6.3 The DTD structure . 49 2.6.4 Adding Declarations . 50 2.6.5 Processing Attribute Values . 52 2.7 The Parser Modules . 54 2.7.1 No Tokenization . 54 2.7.2 Syntax Errors and Error Recovery . 55 2.7.3 Parsing Simple Components . 57 2.7.4 Entity References . 59 2.7.5 Character Data in Content . 62 2.7.6 Validation of Element Content . 63 2.8 The Programming Interface . 65 2.8.1 Hooks - A Functional Variant of Event Handlers . 65 2.8.2 Functorizing the Parser . 68 2.8.3 Implications on the Implementation of the Parser . 69 2.8.4 Functor Dependencies . 70 2.8.5 Building Applications with fxp . 74 2.8.6 Implementing a Tree-Based Interface . 75 2.8.7 Catalog Support . 77 3 Analysis, Comparison and Discussion 79 3.1 Run-Time Analysis and Comparison . 79 3.1.1 Profiling the Parser . 79 3.1.2 Imperative Optimizations . 80 3.1.3 Comparison to XML Parsers Written in Other Languages 82 3.2 Discussion of the Implementation Language . 85 II Querying Structured Documents 87 Introduction 89 Einf ¨uhrung 91 4 Preliminaries 94 4.1 Regular Expressions and Word Languages . 94 4.1.1 The Berry-Sethi Construction . 95 4.2 Trees and Forests . 97 4.2.1 Relation to Ranked Trees . 98 4.2.2 Structural Induction . 99 4.2.3 Path Induction . 100 5 Regular Forest Languages 102 5.1 Forest Grammars . 102 5.2 Closure Properties of Regular Forest Languages . 104 5.3 Bibliographic Notes . 106 6 Forest Automata 108 6.1 Bottom-Up Forest Automata . 108 6.1.1 Regularity . 109 CONTENTS ix 6.1.2 Deterministic and Right-to-Left Forest Automata . 111 6.2 Pushdown Forest Automata . 112 6.2.1 Regularity . 115 6.2.2 Deterministic Pushdown Forest Automata . 116 6.2.3 Right-to-Left Pushdown Forest Automata . 119 6.3 Decision Problems . 120 6.3.1 Bottom-Up Forest Automata . 120 6.3.2 Pushdown Forest Automata . 121 6.4 Matching Structural Conditions . 123 6.4.1 Matching Structure with Bottom-Up Automata . 123 6.4.2 Matching Structure with Pushdown Automata . 126 6.5 Bibliographic Notes . 130 7 Locating Matches in Context 132 7.1 Contextual Conditions .