その時々

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

PythonでXMLを触ってみる9 saxね

今回は要素の開始と終了も拾ってみます。

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>

sax2.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

import xml.sax

class SampleHandler2J(xml.sax.ContentHandler):
    def startDocument(self):
        print 'XML文書が開始しました。'
    def endDocument(self):
        print 'XML文書が終了しました。'
    def startElement(self, tag, attrs):
        print '%rが開始しました。' % tag
    def endElement(self, tag):
        print '%rが終了しました。' % tag

p = xml.sax.make_parser()
p.setContentHandler(SampleHandler2J())
p.parse('SampleS.xml')

実行結果

$ python sax2.py
XML文書が開始しました。
u'cars'が開始しました。
u'car'が開始しました。
u'name'が開始しました。
u'name'が終了しました。
u'price'が開始しました。
u'price'が終了しました。
u'img'が開始しました。
u'img'が終了しました。
u'car'が終了しました。
u'car'が開始しました。
u'name'が開始しました。
u'name'が終了しました。
u'price'が開始しました。
u'price'が終了しました。
u'img'が開始しました。
u'img'が終了しました。
u'car'が終了しました。
u'car'が開始しました。
u'name'が開始しました。
u'name'が終了しました。
u'price'が開始しました。
u'price'が終了しました。
u'img'が開始しました。
u'img'が終了しました。
u'car'が終了しました。
u'cars'が終了しました。
XML文書が終了しました。

気を付けないといけないのはstartElement,endElementの第1引数のtagは
Unicodeで返ってくるというところです。
ですので、printの書式を%sではエラーになってしまいます。
%rで今回は表示しました。