5 Vorlesung und Übung Dr. Peter Pfahler Institut für Informatik Universität Paderborn 6 6. XML-Verarbeitung XML Design Goals XML shall be straightforwardly usable over the Internet. XML shall support a wide variety of applications. XML shall be compatible with SGML. It shall be easy to write programs which process XML documents. The number of optional features in XML is to be kept to the absolute minimum, ideally zero. XML documents should be human-legible and reasonably clear. The XML design should be prepared quickly. The design of XML shall be formal and concise. XML documents shall be easy to create. Terseness in XML markup is of minimal importance. W3C XML Working Group 6-2
6.1. Ereignisbasierte XML-Verarbeitung SAX-Parser (Simple API for XML) 6-3 SAX-Parser in perl Beispiel: XML-Text für einen Warenhaus-Katalog: <katalog> <titel>satelliten Antenne, 60cm</titel> <inhalt>twin LNB, Aluminium, Wandhalter, 10m Kabel</inhalt> <preis waehrung="euro">58,90</preis> <titel>satelliten Antenne, 80cm</titel> <inhalt>twin LNB, Aluminium, Wandhalter, 20m Kabel</inhalt> <preis waehrung="euro">78,90</preis> </katalog> 6-4
soll hierarchisch eingerückt werden: SAX-Parser in perl <katalog> <titel>satelliten Antenne, 60cm </titel> <inhalt>twin LNB, Aluminium, Wandhalter, 10m Kabel </inhalt> <preis waehrung="euro">58,90 </preis> <titel>satelliten Antenne, 80cm </titel> <inhalt>twin LNB, Aluminium, Wandhalter, 20m Kabel </inhalt> <preis waehrung="euro">78,90 </preis> </katalog> 6-5 SAX-Parser in perl use XML::Parser; $p = new XML::Parser(Style => 'Stream'); $p >parsefile("artikel.xml"); sub StartTag { # $_ enthält Kopie des Tags, %_ die Attribut/Wert Paare print "\n$space$_"; $space.= " "; sub EndTag { # $_ enthält Kopie des Tags chop $space; chop $space; print "\n$space$_"; sub Text { # $_ enthält gesammelten Nicht Markup Text $_ =~ s/\n//g; print "$_"; 6-6
SAX-Parser in PHP Beispiel: XML-Text für ein Kochrezept <?xml version='1.0' encoding="iso 8859 1"?> <rezept> <rezept_name>nudeln mit Tomatensauce</rezept_name> <zutaten> <zutat>500g Spaghetti</zutat> <zutat>1 Dose Tomaten</zutat> <zutat>4 Knoblauchzehen</zutat> <zutat>1 geschnittene Zwiebel</zutat> <zutat>oregano, Basilikum, Salz und Pfeffer</zutat> </zutaten> <sowirdsgemacht> Nudeln kochen. Zwiebeln und Knoblauch braten. Tomaten hinzugeben. Abschmecken und 5 Minuten kochen lassen. </sowirdsgemacht> </rezept> 6-7 SAX-Parser in PHP soll in HTML dargestellt werden: 6-8
SAX-Parser in PHP <!DOCTYPE HTML PUBLIC " //W3C//DTD HTML 3.2 Final//EN"> <html> < head><title>meine Lieblingsrezepte</title></head> <body bgcolor="white"> <?php $file = "rezepte.xml"; /* Abbildungstabelle XML > HTML für Rezepte */ $map_tag = array( "rezepte" => "", "rezept" => "hr", "rezept_name" => "h1", "zutaten" => "ol", "zutat" => "li", "sowirdsgemacht" => "p" ); /* XML Tags für die kein Ende Tag im HTML erzeugt wird */ $skip_end_tag = array( "rezepte" => true, "rezept" => true ); 6-9 SAX-Parser in PHP /* die Ereignisbehandlung */ function starttag($parser, $name, $attrs) { global $map_tag; if ($map_tag[$name]) print "<$map_tag[$name]>"; function endtag($parser, $name) { global $map_tag, $skip_end_tag; if (!isset($skip_end_tag[$name])) print "</$map_tag[$name]>"; function data($parser, $data) { print $data; /* die Parser Konfigurierung */ $xp = xml_parser_create(); xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, false); xml_set_element_handler($xp, "starttag", "endtag"); xml_set_character_data_handler($xp, "data"); 6-10
SAX-Parser in PHP /* die XML Verarbeitung */ $fp = fopen($file, "r") or die("could not open XML input"); while ($data = fread($fp, 4096)) { if (!xml_parse($xp, $data, feof($fp))) { die(sprintf("xml error: %s at line %d", xml_error_string(xml_get_error_code($xp)), xml_get_current_line_number($xp))); fclose($fp); xml_parser_free($xp);?> </body </html> 6-11 6.2. Baum-basierte XML-Verarbeitung DOM-Parser (Document Object Model) 6-12
DOM-Parser in PHP Beispiel: Katalog-Daten in XML: <katalog> <titel>satelliten Antenne, 60cm</titel> <inhalt>twin LNB, Aluminium, Wandhalter, 10m Kabel</inhalt> <preis waehrung="euro">58,90</preis> <titel>satelliten Antenne, 80cm</titel> <inhalt>twin LNB, Aluminium, Wandhalter, 20m Kabel</inhalt> <preis waehrung="euro">78,90</preis> </katalog> 6-13 DOM-Parser in PHP sollen in HTML dargestellt werden: 6-14
DOM-Parser in PHP <html> <head><title>katalog</title></head> <body> <?php $xml = simplexml_load_file('artikel.xml'); foreach ($xml >artikel as $a) { echo "<h1>". $a >titel[0]. "</h1>"; echo "<h2>". $a >beschr[0]. "</h2>"; echo "<h3>". $a >inhalt[0]. "</h3>"; echo "<h3>preis: ". $a >preis[0]. " "; echo $a >preis[0]['waehrung']. "</h3>"; echo "<hr>\n";?> </body> </html> verwendet die SimpleXML-Funktionen (ab PHP 5) 6-15