13.7 xml.dom.minidom -- 軽量な DOM 実装

バージョン 2.0 で 新たに追加 された仕様です。

xml.dom.minidom は、軽量な文書オブジェクトモデルインタフェース の実装です。この実装では、完全な DOM よりも 単純で、かつ十分に小さくなるよう意図しています。

DOM アプリケーションは典型的に、XML を DOM に解析 (parse) することで 開始します。xml.dom.minidom では、以下のような解析用の関数 を介して行います:

from xml.dom.minidom import parse, parseString

dom1 = parse('c:\\temp\\mydata.xml') # parse an XML file by name

datasource = open('c:\\temp\\mydata.xml')
dom2 = parse(datasource)   # parse an open file

dom3 = parseString('<myxml>Some data<empty/> some more data</myxml>')

parse() 関数はファイル名か、開かれたファイルオブジェクト を引数にとることができます。

parse( filename_or_file, parser)
与えられた入力から Document を返します。 filename_or_file はファイル名でもファイルオブジェクトでもかまいません。parser を指定する場合、SAX2 パーザオブジェクトでなければなりません。 この関数はパーザの文書ハンドラを変更し、名前空間サポートを有効に します; (エンティティリゾルバ (entity resolver) のような) 他のパーザ設定 は前もっておこなわなければなりません。

XML データを文字列で持っている場合、parseString() を 代わりに使うことができます:

parseString( string[, parser])
string を表現する Document を返します。このメソッドは 文字列に対する StringIO オブジェクトを生成して、その オブジェクトを parse に渡します。

これらの関数は両方とも、文書の内容を表現する Document オブジェクトを 返します。

parse()parseString() といった関数が行うのは、 XML パーザを、何らかの SAX パーザからくる解析イベント (parse event) を受け取って DOM ツリーに変換できるような ``DOM ビルダ (DOM builder)'' に結合することです。関数は誤解を招くような名前になっているかも しれませんが、インタフェースについて学んでいるときには理解しやすい でしょう。文書の解析はこれらの関数が戻るより前に完結します; 要するに、 これらの関数自体はパーザ実装を提供しないということです。

``DOM 実装'' オブジェクトのメソッドを呼び出して Document を 生成することもできます。このオブジェクトは、xml.dom パッケージ、またはxml.dom.minidom モジュールの getDOMImplementation() 関数を呼び出して取得できます。 xml.dom.minidom モジュールの実装を使うと、常に minidom 実装の Document インスタンスを返します。一方、 xml.dom 版の関数では、別の実装によるインスタンスを 返すかもれません (PyXML package がインストールされているとそうなるでしょう)。Document を取得したら、DOM を構成するために子ノードを追加していくことができます:

from xml.dom.minidom import getDOMImplementation

impl = getDOMImplementation()

newdoc = impl.createDocument(None, "some_tag", None)
top_element = newdoc.documentElement
text = newdoc.createTextNode('Some textual content.')
top_element.appendChild(text)

DOM 文書オブジェクトを手にしたら、XML 文書のプロパティやメソッドを 使って、文書の一部にアクセスすることができます。これらのプロパティは DOM 仕様で定義されています。文書オブジェクトの主要なプロパティは documentElement プロパティです。このプロパティは XML 文書の主要な要素: 他の全ての要素を保持する要素、を与えます。 以下にプログラム例を示します:

dom3 = parseString("<myxml>Some data</myxml>")
assert dom3.documentElement.tagName == "myxml"

DOM を使い終えたら、後片付けを行わなければなりません。 Python のバージョンによっては、循環的に互いを参照するオブジェクト に対するガベージコレクションをサポートしていないため、この操作が 必要となります。この制限が全てのバージョンの Python から除去される までは、循環参照オブジェクトが消去されないものとしてコードを 書くのが無難です。

DOM を片付けるには、 unlink() メソッドを呼び出します:

dom1.unlink()
dom2.unlink()
dom3.unlink()

unlink() は、 DOM API に対する xml.dom.minidom 特有の拡張です。ノードに対して unlink() を呼び出した後は、 ノードとその下位ノードは本質的には無意味なものとなります。

参考:

Document Object Model (DOM) Level 1 Specification
xml.dom.minidom でサポートされている DOM の W3C 勧告。



ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。