バージョン 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() 関数はファイル名か、開かれたファイルオブジェクト を引数にとることができます。
filename_or_file, parser) |
XML データを文字列で持っている場合、parseString() を 代わりに使うことができます:
string[, parser]) |
これらの関数は両方とも、文書の内容を表現する 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() を呼び出した後は、 ノードとその下位ノードは本質的には無意味なものとなります。
参考: