# 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 勧告。