その時々

その時々で違うんです。特に決まっていないんです。

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