PythonでXMLを触ってみる12 saxね
XMLGeneratorを使って出力する場合はXMLFilterBaseと組み合わせて使うのがデフォのようです。
SampleS.xml
<?xml version="1.0" encoding="UTF-8"?> <cars> <car country="日本"> <name>乗用車</name> <price>150</price> <img file="car1.jpg" /> </car> <car country="日本"> <name>トラック</name> <price>500</price> <img file="car2.jpg" /> </car> <car country="アメリカ"> <name>オープンカー</name> <price>200</price> <img file="car3.jpg" /> </car> </cars>
sax5.py
#!/usr/bin/python # -*- coding: utf-8 -*- import xml.sax, xml.sax.saxutils from xml.sax.saxutils import XMLFilterBase, XMLGenerator class SampleHandler5J(XMLFilterBase): def __init__(self, upstream, downstream): XMLFilterBase.__init__(self, upstream) self._downstream = downstream def startDocument(self): self._downstream.startDocument() def endDocument(self): self._downstream.endDocument() def startElement(self, name, attrs): self._downstream.startElement(name, attrs) def endElement(self, name): self._downstream.endElement(name) def characters(self, content): self._downstream.characters(content) parser = xml.sax.make_parser() file = open('resultS2.xml', 'w') downstream_handler = XMLGenerator(file, 'utf-8') filter_handler = SampleHandler5J(parser, downstream_handler) filter_handler.parse('SampleS.xml')
実行結果
$ cat resultS2.xml <?xml version="1.0" encoding="utf-8"?> <cars> <car country="日本"> <name>乗用車</name> <price>150</price> <img file="car1.jpg"></img> </car> <car country="日本"> <name>トラック</name> <price>500</price> <img file="car2.jpg"></img> </car> <car country="アメリカ"> <name>オープンカー</name> <price>200</price> <img file="car3.jpg"></img> </car> </cars>
上流(upstream)から下流(downstream)に向けてXMLを流していくのですが、
途中でフィルタを作成することによりXMLを絞り込むような形で使うようです。
今回はフィルタを全くかけていませんので、upstreamからdownstreamに
そのまま流し込んでいます。
参考URL
http://www.ibm.com/developerworks/jp/xml/library/x-tipsaxflex/index.html