PyXML

 PythonのXML関連のモジュールは、 XML-SIG(Special Interest Group)という分科会によって開発されており、 Pythonトピックガイド からリンクが伸びる XMLトピックガイドを本拠としています。 XML-SIGはこのXMLトピックガイドの保守とともに、 PyXML なるPythonの標準XMLモジュールを開発しています。 PyXMLは今のところ、本体に付属しない拡張モジュールですが、 XML-SIGは究極の目的として「PythonをXML処理に最適な言語にする」 を掲げるなど、鼻息の荒さが伺えます。 さっそくインストールして使ってみましょう。

 ただし、PyXMLはSAX・DOM準拠のXMLパーサー(構文解析)ライブラリで、 XSLT変換のモジュールは今のところ姿が見えないので、 XMLのパージングに専ら使うことになりましょう。 SAX(Simple API for XML)は、XML文書を先頭から最後まで順に読みながら、 XMLタグに出会うたびに何かの処理をしていくスタイルの XMLアプリケーションに適したシンプルなXML解析APIです。 DOM(Document Object Model)は文書構造をメモリ上にツリーとして分解するAPIで、 XML文書に含まれるデータの一部を修正して保存するタイプのアプリケーションに適したAPIです。 PyXMLはSAXのバージョン1、2をサポートしており、 CやJavaなどでSAX準拠のAPIを使ったことがあれば簡単です。 また、SAXはシンプルなので、XML処理は初めてという開発者にとっても、 付属のサンプルを見ながらイメージをつかんでいけると思います。

 XML-SIGのトピックガイドでは、PythonのXML関連ソフトウェアは 「PyXMLとその他の仲間たち」という位置づけになっていますが、 Python+XMLの仲間達はこの他にも多数のオープンソース・プロジェクトが SourceForgeに上がっており、日夜活発に開発が進められています。

Windowsへのインストール
 次の環境で試しました。
プラットフォームPyXMLPython
MS-Windows XP Home Edition0.8.02.1
MS-Windows XP Home Edition0.8.12.2
MS-Windows XP Home Edition0.8.32.3

  1. 上のリンクから、バイナリ配布 PyXML-0.8.3.win32-py2.3.exe をダウンロードし、エクスプローラでダブルクリックするなどして起動します。
  2. Pythonおなじみのインストーラが起動するので、その指示に従えばインストールは完了です。

プログラミング

# 2002/08/07
import sys # for sys.argv
from xml.sax import saxexts

class DocHandler:
  def characters(self, data, start, length):
    print "**[" + data[start:start+length] + "]"

  def ignorableWhitespace(self, data, start, length):
    print "oo[" + data[start:start+length] + "]"

  def startDocument(self):
    print "START DOCUMENT"

  def endDocument(self):
    print "END DOCUMENT"

  def startElement(self, name, attrs):
    print "START <" + name + "> ",
    for s in attrs:
      print "[" + s + "]={" + attrs[s] + "} "
    print ""

  def endElement(self, name):
    print "END <" + name + ">"

  def setDocumentLocator(self, data):
    print "DL: " + str(data)

  def processingInstruction(self, data, data2):
    print "PI: " + str(data) + "," + str(data2)

  def __getattr__(self, name, *rest):
    print "@@ETC: " + name

class ErrorHandler:
  def error(self, exception):
    print "ERROR: " + str(exception)

  def fatalError(self, exception):
    print "FATAL ERROR: " + str(exception)

  def warning(self, exception):
    print "WARNING: " + str(exception)

pf=saxexts.ParserFactory()
p=pf.make_parser("xml.sax.drivers.drv_xmlproc")

p.setDocumentHandler(DocHandler())
#p.setDTDHandler(SAXtracer("dtd_handler"))
p.setErrorHandler(ErrorHandler())
#p.setEntityResolver(SAXtracer("ent_handler"))
p.parse(sys.argv[1])

 これはSAXスタイルのサンプルです。 SAXでは、タグに出会った順に何か処理をする関数をイベントとして登録しておきます。 つまり、パージングはイベントドリブンで進む、というわけです。 イベントハンドラ関数を定義するために、PyXMLではPythonのクラスとしてハンドラを定義します。 これはイベントの種類別に別々のクラスにしても、全部まとめて同じクラスにしても構いません。 このサンプルでは多少見通しをよくするために、 エラーや警告のイベントを受けるためのErrorHandlerクラスと、 その他のタグを見つけたときの処理をするDocHandlerクラスに分けています。

セクションのサブメニューに戻る
(first uploaded 2002/08/11 last updated 2003/08/14)