Dies ist die Support Website des Buches:: Das Python Praxisbuch Der große Profi-Leitfaden für Programmierer Farid Hajji Addison Wesley / Pearson Education ISBN 978-3-8273-2543-3 (Sep 2008), 1298 Seiten. ****************** 12. XML und XSLT ****************** Eine XML-Datei ============== .. literalinclude:: ../att/xml/languages.xml :language: xml `languages.xml `_ Screenshots: * `Die Datei languages.xml `_ xml.etree.ElementTree ===================== 4Suite-XML ========== Screenshots: * `Screenshot der 4Suite-XML Website `_ 4Suite-XML installieren ----------------------- URLs: * `Die 4Suite-XML Website `_ * `Das im Buch benutzte Package `_ (neueres mit ``easy_install 4Suite-XML``) Screenshots: * `Installation von 4Suite-XML unter Windows `_ Die 4Suite-XML-Skripte ---------------------- .. literalinclude:: ../att/xml/test.xml :language: xml `test.xml `_ .. literalinclude:: ../att/xml/test2.xml :language: xml `test2.xml `_ .. literalinclude:: ../att/xml/test3.xml :language: xml `test3.xml `_ .. literalinclude:: ../att/xml/test4.xml :language: xml `test4.xml `_ .. literalinclude:: ../att/xml/test5.xml :language: xml `test5.xml `_ .. literalinclude:: ../att/xml/languages.xsl :language: xml `languages.xsl `_ Screenshots: * `languages.xsl im Browser `_ Nach ``4xslt languages.xml languages.xsl > languages.html`` sieht :file:`languages.html` wie folgt aus: .. code-block:: xml Programming Languages

Programming Languages

  • Python: Guido van Rossum
  • Ruby: Yukihiro Matsumoto
  • Perl: Larry Wall
  • PHP: Rasmus Lerdorf
  • C: Dennis Ritchie Brian Kernighan
  • C++: Bjarne Stroustrup
  • Lisp: John McCarthy
Screenshots: * `XPath Ausdruck in doppelten Anführungszeichen `_ Ft.Xml.InputSource-Eingabequellen --------------------------------- Wie man ``Ft.Xml.InputSource`` benutzt:: from Ft.Xml import InputSource factory = InputSource.DefaultFactory isrc1 = factory.fromString("", "https://pythonbook.hajji.org/examples/xml") isrc2 = factory.fromStream(open("/var/tmp/languages.xml", "rb"), "https://pythonbook.hajji.org/examples/xml") isrc3 = factory.fromUri( "https://pythonbook.hajji.org/examples/xml/languages.xml") DOM --- ``isrc4`` sieht so aus:: >>> isrc4 = factory.fromString(''' ... ... ... ]> ... ''', "https://pythonbook.hajji.org/examples/xml") Und ``isrc5`` so:: from Ft.Xml import ReaderException isrc5 = factory.fromString(''' ]> Not empty''', "https://pythonbook.hajji.org/examples/xml") try: doc5 = vreader.parse(isrc5) print "doc5 successfully parsed" except ReaderException, e: print e DOM verstehen ^^^^^^^^^^^^^ Um die Ausgabe als (Byte-)String zu erhalten, kann man ``StringIO`` benutzen:: from cStringIO import StringIO sio = StringIO() PrettyPrint(doc1, stream=sio, encoding="utf-8") buf = sio.getvalue() sio.close() URLs: * `4Suite-XML Dokumentation `_ * `Das Kapitel zu xml.dom in der Python Dokumentation `_ Elemente mit XPath extrahieren ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Man kann Elemente aus einer XML-Datei direkt extrahieren, aber es ist subobtimal:: from Ft.Xml import InputSource from Ft.Xml.Domlette import NonvalidatingReaderBase factory = InputSource.DefaultFactory reader = NonvalidatingReaderBase() isrc2 = factory.fromStream(open("/var/tmp/languages.xml", "rb"), "https://pythonbook.hajji.org/examples/xml") doc2 = reader.parse(isrc2) root = doc2.documentElement python = root.childNodes[1] Einfacher geht es mit XPath:: >>> root.xpath(u'//language[@name="python"]') [] >>> python = root.xpath(u'//language[@name="python"]')[0] >>> python URLs: * `Informationen zu XPath `_ SAX --- Die Eingabequelle:: from Ft.Xml import InputSource factory = InputSource.DefaultFactory isrc = factory.fromUri("file:///var/tmp/languages.xml") Der SAX-Parser (Saxlette):: from Ft.Xml import Sax parser = Sax.CreateParser() Der Content-Handler: .. literalinclude:: ../att/xml/tagcounter.py `tagcounter.py `_ Und nun parsen wir:: from tagcounter import TagCounter handler = TagCounter() parser.setContentHandler(handler) parser.parse(isrc) URLs: * `Die Methoden des Event-Handlers `_ Transformationen mit XSLT ========================= Um :file:`languages.xml` mit :file:`languages.xsl` zu transformieren:: from Ft.Xml import InputSource factory = InputSource.DefaultFactory ixml = factory.fromUri('file:///var/tmp/languages.xml') ixsl = factory.fromUri('file:///var/tmp/languages.xsl') from Ft.Xml.Xslt import Processor processor = Processor.Processor() processor.appendStylesheet(ixsl) result = processor.run(ixml) ``result`` enthält: .. code-block:: xml Programming Languages

Programming Languages

  • Python: Guido van Rossum
  • Ruby: Yukihiro Matsumoto
  • Perl: Larry Wall
  • PHP: Rasmus Lerdorf
  • C: Dennis Ritchie Brian Kernighan
  • C++: Bjarne Stroustrup
  • Lisp: John McCarthy
Zusammenfassung ===============