# 13.5 `xml.parsers.expat` -- Expat を使った高速な XML 解析

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

`xml.parsers.expat` モジュールは、検証 (validation) を 行わない XML パーザ (parser, 解析器)、Expatへの Python インタフェースです。 モジュールは一つの拡張型 `xmlparser` を提供します。これは XMLパーザの現在の状況を表します。一旦 `xmlparser` オブジェクトを 生成すると、オブジェクトの様々な属性をハンドラ関数 (handler function) に設定できます。 その後、XML 文書をパーザに入力すると、 XML文書の文字列とマークアップ に応じてハンドラ関数が呼び出されます。

このモジュールでは、Expatパーザへのアクセスを提供するために `pyexpat` モジュールを使用します。 `pyexpat`モジュールの直接使用は撤廃されています。

このモジュールは、例外を一つと型オブジェクトを一つ提供しています。

exception `ExpatError`
  Expat がエラーを報告したときに例外を送出します。Expatのエラーを 解釈する上での詳細な情報は、 13.5.2 の ``ExpatError Exceptions,'' を参照してください。

exception `error`
  `ExpatError`への別名です。

`XMLParserType`
  `ParserCreate()` 関数から返された戻り値の型を示します。

`xml.parsers.expat` モジュールには以下の 2 つの関数が収められて います:

`ErrorString`( | errno)

  与えられたエラー番号 errno を解説する文字列を返します。

`ParserCreate`( | [encoding[, namespace_separator]])

  新しい `xmlparser` オブジェクトを作成し、返します。 encoding が指定されていた場合、XMLデータで使われている 文字列のエンコード名でなければなりません。Expatは、Pythonのように多くの エンコードをサポートしておらず、またエンコーディングのレパートリを 拡張することはできません; サポートするエンコードは、UTF-8, UTF-16, ISO-8859-1 (Latin1), ASCII です。encodingが 指定されると、文書に対する明示的、非明示的なエンコード指定を 上書き (override) します。

  Expat はオプションで XML 名前空間の処理を行うことができます。 これは引数 namespace_separator に値を指定することで 有効になります。 この値は、1文字の文字列でなければなりません; 文字列が誤った長さ を持つ場合には `ValueError` が送出されます (`None` は 値の省略と見なされます) 名前空間の処理が可能なとき、名前空間に属する 要素と属性が展開されます。要素のハンドラである `StartElementHandler` と `EndElementHandler` に渡された 要素名は、名前空間のURI、名前空間の区切り文字、要素名のローカル部を 連結したものになります。名前空間の区切り文字が 0 バイト (`chr(0)`) の場合、名前空間の URI とローカル部は区切り文字なしで 連結されます。

  たとえば、 namespace_separator に空白文字("`` ")がセットされ、 次のような文書が解析されるとします。

      <?xml version="1.0"?>
      <root xmlns    = "http://default-namespace.org/"
            xmlns:py = "http://www.python.org/ns/">
        <py:elem1 />
        <elem2 xmlns="" />
      </root>

  `StartElementHandler` は各要素ごとに次のような文字列を受け取ります。

      http://default-namespace.org/ root
      http://www.python.org/ns/ elem1
      elem2

参考資料:

The Expat XML Parser
  Expatプロジェクトのホームページ