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

警告

`pyexpat` モジュールは悪意を持って作成されたデータに対して安全ではありません。信頼できないデータや認証されていないデータをパースする必要がある場合は XML の脆弱性 を参照してください。

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

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

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

exception `xml.parsers.expat.``ExpatError`

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

exception `xml.parsers.expat.``error`

  `ExpatError` の別名です。

`xml.parsers.expat.``XMLParserType`

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

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

`xml.parsers.expat.``ErrorString`(errno)

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

`xml.parsers.expat.``ParserCreate`(encoding=None, namespace_separator=None)

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

  `pyexpat` が使っている `Expat` ライブラリの制限により、返される `xmlparser` インスタンスは単独の XML ドキュメントの解析にしか使えません。それぞれのドキュメントごとに別々のパーサのインスタンスを作るために `ParserCreate` を呼び出してください。

参考

The Expat XML Parser

  Expatプロジェクトのホームページ。

## XMLParser オブジェクト

`xmlparser` オブジェクトは以下のようなメソッドを持ちます:

`xmlparser.``Parse`(data[, isfinal])

  文字列 data の内容を解析し、解析されたデータを処理するための適切な関数を呼び出します。このメソッドを最後に呼び出す時は isfinal を真にしなければなりません; 単体ファイルを細切れに渡して解析出来ることを意味しますが、複数ファイルは扱えません。 data にはいつでも空の文字列を渡せます。

`xmlparser.``ParseFile`(file)

  file オブジェクトから読み込んだXMLデータを解析します。 file には read(nbytes) メソッドのみが必要です。このメソッドはデータがなくなった場合に空文字列を返さねばなりません。。

`xmlparser.``SetBase`(base)

  (XML) 宣言中のシステム識別子中の相対 URI を解決するための、基底 URI を設定します。相対識別子の解決はアプリケーションに任されます: この値は関数 `ExternalEntityRefHandler()` や `NotationDeclHandler()`, `UnparsedEntityDeclHandler()` に引数 base としてそのまま渡されます。

`xmlparser.``GetBase`()

  以前の `SetBase()` によって設定された基底 URI を文字列の形で返します。 `SetBase()` が呼ばれていないときには `None` を返します。

`xmlparser.``GetInputContext`()

  現在のイベントを発生させた入力データを文字列として返します。データはテキストの入っているエンティティが持っているエンコードになります。イベントハンドラがアクティブでないときに呼ばれると、戻り値は `None` となります。

`xmlparser.``ExternalEntityParserCreate`(context[, encoding])

  親となるパーザで解析された内容が参照している、外部で解析されるエンティティを解析するために使える "子の" パーザを作成します。 context パラメータは、以下に記すように `ExternalEntityRefHandler()` ハンドラ関数に渡される文字列でなければなりません。子のパーザは `ordered_attributes`, `specified_attributes` が現在のパーザの値に設定されて生成されます。

`xmlparser.``SetParamEntityParsing`(flag)

  パラメータエンティティ (外部DTDサブセットを含む) の解析を制御します。 flag の有効な値は、 `XML_PARAM_ENTITY_PARSING_NEVER`, `XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE`, `XML_PARAM_ENTITY_PARSING_ALWAYS` です。 flag の設定をしたら true を返します。

`xmlparser.``UseForeignDTD`([flag])

  flag の値をデフォルトのtrueにすると、Expatは代わりのDTDをロードするため、すべての引数に `None` を設定して `ExternalEntityRefHandler` を呼び出します。XML文書が文書型定義を持っていなければ、 `ExternalEntityRefHandler` が呼び出しますが、 `StartDoctypeDeclHandler` と `EndDoctypeDeclHandler` は呼び出されません。

  flag にfalseを与えると、メソッドが前回呼ばれた時のtrueの設定が解除されますが、他には何も起こりません。

  このメソッドは `Parse()` または `ParseFile()` メソッドが呼び出される前にだけ呼び出されます;これら2つのメソッドのどちらかが呼び出されたあとにメソッドが呼ばれると、 `code` に定数 `errors.codes[errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING]` が設定されて例外 `ExpatError` が送出されます。

`xmlparser.``SetReparseDeferralEnabled`(enabled)

  警告

  Calling `SetReparseDeferralEnabled(False)` has security implications, as detailed below; please make sure to understand these consequences prior to using the `SetReparseDeferralEnabled` method.

  Expat 2.6.0 introduced a security mechanism called "reparse deferral" where instead of causing denial of service through quadratic runtime from reparsing large tokens, reparsing of unfinished tokens is now delayed by default until a sufficient amount of input is reached. Due to this delay, registered handlers may — depending of the sizing of input chunks pushed to Expat — no longer be called right after pushing new input to the parser. Where immediate feedback and taking over responsiblity of protecting against denial of service from large tokens are both wanted, calling `SetReparseDeferralEnabled(False)` disables reparse deferral for the current Expat parser instance, temporarily or altogether. Calling `SetReparseDeferralEnabled(True)` allows re-enabling reparse deferral.

  Note that `SetReparseDeferralEnabled()` has been backported to some prior releases of CPython as a security fix. Check for availability of `SetReparseDeferralEnabled()` using `hasattr()` if used in code running across a variety of Python versions.

  バージョン 3.9.19 で追加.

`xmlparser.``GetReparseDeferralEnabled`()

  Returns whether reparse deferral is currently enabled for the given Expat parser instance.

  バージョン 3.9.19 で追加.

`xmlparser` オブジェクトは次のような属性を持ちます:

`xmlparser.``buffer_size`

  `buffer_text` が真の時に使われるバッファのサイズです。この属性に新しい整数値を代入することで違うバッファサイズにできます。サイズが変えられるときにバッファはフラッシュされます。

`xmlparser.``buffer_text`

  この値を真にすると、 `xmlparser` オブジェクトが Expatから返されたもとの内容をバッファに保持するようになります。これにより可能なときに何度も `CharacterDataHandler()` を呼び出してしまうようなことを避けることができます。Expatは通常、文字列のデータを行末ごと大量に破棄するため、かなりパフォーマンスを改善できるはずです。この属性はデフォルトでは偽で、いつでも変更可能です。

`xmlparser.``buffer_used`

  `buffer_text` が利用可能なとき、バッファに保持されたバイト数です。これらのバイトはUTF-8でエンコードされたテキストを表します。この属性は `buffer_text` が偽の時には意味がありません。

`xmlparser.``ordered_attributes`

  この属性をゼロ以外の整数にすると、報告される(XMLノードの) 属性を辞書型ではなくリスト型にします。属性は文書のテキスト中の出現順で示されます。それぞれの属性は、2つのリストのエントリ: 属性名とその値、が与えられます。 (このモジュールの古いバージョンでも、同じフォーマットが使われています。) デフォルトでは、この属性はデフォルトでは偽となりますが、いつでも変更可能です。

`xmlparser.``specified_attributes`

  ゼロ以外の整数にすると、パーザは文書のインスタンスで特定される属性だけを報告し、属性宣言から導出された属性は報告しないようになります。この属性が指定されたアプリケーションでは、XMLプロセッサの振る舞いに関する標準に従うために必要とされる (文書型) 宣言によって、どのような付加情報が利用できるのかということについて特に注意を払わなければなりません。デフォルトで、この属性は偽となりますが、いつでも変更可能です。

以下の属性には、 `xmlparser` オブジェクトで最も最近に起きたエラーに関する値が入っており、また `Parse()` または `ParseFile()` メソッドが `xml.parsers.expat.ExpatError` 例外を送出した際にのみ正しい値となります。

`xmlparser.``ErrorByteIndex`

  エラーが発生したバイトのインデクスです。

`xmlparser.``ErrorCode`

  エラーを特定する数値によるコードです。この値は `ErrorString()` に渡したり、 `errors` オブジェクトで定義された内容と比較できます。

`xmlparser.``ErrorColumnNumber`

  エラーの発生したカラム番号です。

`xmlparser.``ErrorLineNumber`

  エラーの発生した行番号です。

以下の属性は `xmlparser` オブジェクトがその時パースしている位置に関する値を保持しています。コールバックがパースイベントを報告している間、これらの値はイベントの生成した文字列の先頭の位置を指し示します。コールバックの外から参照された時には、（対応するコールバックであるかにかかわらず）直前のパースイベントの位置を示します。

`xmlparser.``CurrentByteIndex`

  パーサへの入力の、現在のバイトインデックス。

`xmlparser.``CurrentColumnNumber`

  パーサへの入力の、現在のカラム番号。

`xmlparser.``CurrentLineNumber`

  パーサへの入力の、現在の行番号。

以下に指定可能なハンドラのリストを示します。 `xmlparser` オブジェクト o にハンドラを指定するには、 `o.handlername = func` を使用します。 handlername は、以下のリストに挙げた値をとらなければならず、また func は正しい数の引数を受理する呼び出し可能なオブジェクトでなければなりません。引数は特に明記しない限り、すべて文字列となります。

`xmlparser.``XmlDeclHandler`(version, encoding, standalone)

  XML 宣言が解析された時に呼ばれます。 XML宣言は XML 勧告の適用バージョン、文書テクストのエンコード、ならびに任意の "standalone" 宣言の (任意の) 宣言です。 version と encoding は文字列で、standalone は文書がスタンドアローンと宣言された場合は `1`、スタンドアローンでないと宣言された場合は `0`、スタンドアローン節がない場合は `-1` です。 Expat のバージョン 1.95.0 以降でのみ使用できます。

`xmlparser.``StartDoctypeDeclHandler`(doctypeName, systemId, publicId, has_internal_subset)

  Expatが文書型宣言 (`<!DOCTYPE ...`)を解析し始めたときに呼び出されます。 doctypeName は、与えられた値がそのまま Expat に提供されます。 systemId と publicId パラメタが指定されている場合、それぞれシステムと公開識別子を与えます。省略する時には `None` にします。文書が内部的な文書宣言のサブセット (internal document declaration subset) を持つか、サブセット自体の場合、 has_internal_subset は true になります。このハンドラには、Expat version 1.2以上が必要です。

`xmlparser.``EndDoctypeDeclHandler`()

  Expatが文書型宣言の解析を終えたときに呼び出されます。このハンドラには、Expat version 1.2以上が必要です。

`xmlparser.``ElementDeclHandler`(name, model)

  それぞれの要素型宣言ごとに呼び出されます。 name は要素型の名前であり、 model は内容モデル (content model) の表現です。

`xmlparser.``AttlistDeclHandler`(elname, attname, type, default, required)

  ひとつの要素型で宣言される属性ごとに呼び出されます。属性リストの宣言が 3つの属性を宣言したとすると、このハンドラは各属性に1度ずつ、 3度呼び出されます。 elname は要素名であり、これに対して宣言が適用され、 attname が宣言された属性名となります。属性型は文字列で、 type として渡されます。取り得る値は、 `'CDATA'`, `'ID'`, `'IDREF'`, ... です。 default は、文書のインスタンスによって属性が指定されていないときに使用されるデフォルト値です。デフォルト値(`#IMPLIED` values)が存在しないときには `None` を与えます。文書のインスタンス中に属性値を与える必要のあるときには required が true になります。これにはExpat version 1.95.0 以上が必要です。

`xmlparser.``StartElementHandler`(name, attributes)

  要素の開始ごとに呼び出されます。 name は要素名を持つ文字列で、 attributes は要素の属性です。 `ordered_attributes` が真の場合これはリストです (詳細は `ordered_attributes` を参照してください)。 そうでなければ名前を値に対応させる辞書です。

`xmlparser.``EndElementHandler`(name)

  要素の終端を処理するごとに呼び出されます。

`xmlparser.``ProcessingInstructionHandler`(target, data)

  処理命令を処理するごとに呼び出されます。

`xmlparser.``CharacterDataHandler`(data)

  文字データを処理するときに呼びだされます。このハンドラは通常の文字データ、 CDATAセクション、無視できる空白文字列のために呼び出されます。これらを識別しなければならないアプリケーションは、要求された情報を収集するために `StartCdataSectionHandler`, `EndCdataSectionHandler`, and `ElementDeclHandler` コールバックメソッドを使用できます。

`xmlparser.``UnparsedEntityDeclHandler`(entityName, base, systemId, publicId, notationName)

  解析されていない (NDATA) エンティティ宣言を処理するために呼び出されます。このハンドラは Expat ライブラリのバージョン1.2のためだけに存在します; より最近のバージョンでは、代わりに `EntityDeclHandler` を使用してください (根底にある Expat ライブラリ内の関数は、撤廃されたものであると宣言されています)。

`xmlparser.``EntityDeclHandler`(entityName, is_parameter_entity, value, base, systemId, publicId, notationName)

  エンティティ宣言ごとに呼び出されます。パラメタと内部エンティティについて、 value はエンティティ宣言の宣言済みの内容を与える文字列となります; 外部エンティティの時には `None` となります。解析済みエンティティの場合、 notationName パラメタは `None` となり、解析されていないエンティティの時には記法 (notation) 名となります。 is_parameter_entity は、エンティティがパラメタエンティティの場合真に、一般エンティティ (general entitiy) の場合には偽になります (ほとんどのアプリケーションでは、一般エンティティのことしか気にする必要がありません)。このハンドラは Expat ライブラリのバージョン1.95.0 以降でのみ使用できます。

`xmlparser.``NotationDeclHandler`(notationName, base, systemId, publicId)

  記法の宣言 (notation declaration) で呼び出されます。 notationName, base, systemId, および publicId を与える場合、文字列にします。public な識別子が省略された場合、 publicId は `None` になります。

`xmlparser.``StartNamespaceDeclHandler`(prefix, uri)

  要素が名前空間宣言を含んでいる場合に呼び出されます。名前空間宣言は、宣言が配置されている要素に対して `StartElementHandler` が呼び出される前に処理されます。

`xmlparser.``EndNamespaceDeclHandler`(prefix)

  名前空間宣言を含んでいたエレメントの終了タグに到達したときに呼び出されます。このハンドラは、要素に関する名前空間宣言ごとに、 `StartNamespaceDeclHandler` とは逆の順番で一度だけ呼び出され、各名前空間宣言のスコープが開始されたことを示します。このハンドラは、要素が終了する際、対応する `EndElementHandler` が呼ばれた後に呼び出されます。

`xmlparser.``CommentHandler`(data)

  コメントで呼び出されます。 data はコメントのテキストで、先頭の '`<!-` `-`' と末尾の '`-` `->`' を除きます。

`xmlparser.``StartCdataSectionHandler`()

  CDATA セクションの開始時に呼び出されます。CDATA セクションの構文的な開始と終了位置を識別できるようにするには、このハンドラと `EndCdataSectionHandler` が必要です。

`xmlparser.``EndCdataSectionHandler`()

  CDATA セクションの終了時に呼び出されます。

`xmlparser.``DefaultHandler`(data)

  XML 文書中で、適用可能なハンドラが指定されていない文字すべてに対して呼び出されます。この文字とは、検出されたことが報告されるが、ハンドラは指定されていないようなコンストラクト (construct) の一部である文字を意味します。

`xmlparser.``DefaultHandlerExpand`(data)

  `DefaultHandler()` と同じですが、内部エンティティの展開を禁止しません。エンティティ参照はデフォルトハンドラに渡されません。

`xmlparser.``NotStandaloneHandler`()

  XML 文書がスタンドアロンの文書として宣言されていない場合に呼び出されます。外部サブセットやパラメタエンティティへの参照が存在するが、XML 宣言が XML 宣言中で standalone 変数を `yes` に設定していない場合に起きます。このハンドラが `0` を返すと、パーザは `XML_ERROR_NOT_STANDALONE` を発生させます。このハンドラが設定されていなければ、パーザは前述の事態で例外を送出しません。

`xmlparser.``ExternalEntityRefHandler`(context, base, systemId, publicId)

  外部エンティティの参照時に呼び出されます。 base は現在の基底 (base) で、以前の `SetBase()` で設定された値になっています。 public、および system の識別子である、 systemId と publicId が指定されている場合、値は文字列です; public 識別子が指定されていない場合、 publicId は `None` になります。 context の値は不明瞭なものであり、以下に記述するようにしか使ってはなりません。

  外部エンティティが解析されるようにするには、このハンドラを実装しなければなりません。このハンドラは、 `ExternalEntityParserCreate(context)` を使って適切なコールバックを指定し、子パーザを生成して、エンティティを解析する役割を担います。このハンドラは整数を返さなければなりません; `0` を返した場合、パーザは `XML_ERROR_EXTERNAL_ENTITY_HANDLING` エラーを送出します。そうでない場合、解析を継続します。

  このハンドラが与えられておらず、 `DefaultHandler` コールバックが指定されていれば、外部エンティティは `DefaultHandler` で報告されます。

## ExpatError 例外

`ExpatError` 例外はいくつかの興味深い属性を備えています:

`ExpatError.``code`

  特定のエラーに対する Expat の内部エラー番号です。 `errors.messages` 辞書はこれらのエラー番号を Expat のエラーメッセージに対応させます。 例えば:

      from xml.parsers.expat import ParserCreate, ExpatError, errors

      p = ParserCreate()
      try:
          p.Parse(some_xml_document)
      except ExpatError as err:
          print("Error:", errors.messages[err.code])

  `errors` モジュールはエラーメッセージ定数と、それらのメッセージをエラーコードに対応させる辞書 `codes` も提供しています。以下を参照してください。

`ExpatError.``lineno`

  エラーが検出された場所の行番号です。最初の行の番号は `1` です。

`ExpatError.``offset`

  エラーが発生した場所の行内でのオフセットです。最初のカラムの番号は `0` です。

## 使用例

以下のプログラムでは、与えられた引数を出力するだけの三つのハンドラを定義しています。

    import xml.parsers.expat

    # 3 handler functions
    def start_element(name, attrs):
        print('Start element:', name, attrs)
    def end_element(name):
        print('End element:', name)
    def char_data(data):
        print('Character data:', repr(data))

    p = xml.parsers.expat.ParserCreate()

    p.StartElementHandler = start_element
    p.EndElementHandler = end_element
    p.CharacterDataHandler = char_data

    p.Parse("""<?xml version="1.0"?>
    <parent id="top"><child1 name="paul">Text goes here</child1>
    <child2 name="fred">More text</child2>
    </parent>""", 1)

このプログラムの出力は以下のようになります:

    Start element: parent {'id': 'top'}
    Start element: child1 {'name': 'paul'}
    Character data: 'Text goes here'
    End element: child1
    Character data: '\n'
    Start element: child2 {'name': 'fred'}
    Character data: 'More text'
    End element: child2
    Character data: '\n'
    End element: parent

## 内容モデルの記述

内容モデルは入れ子になったタプルを使って記述されています。各タプルには以下の 4 つの値が収められています: 型、限定詞 (quantifier)、名前、そして子のタプル。子のタプルは単に内容モデルを記述したものです。

最初の二つのフィールドの値は `xml.parsers.expat.model` モジュールで定義されている定数です。これらの定数は二つのグループ: モデル型 (model type) グループと限定子 (quantifier) グループ、に取りまとめられます。

以下にモデル型グループにおける定数を示します:

`xml.parsers.expat.model.``XML_CTYPE_ANY`

  モデル名で指定された要素は `ANY` の内容モデルを持つと宣言されます。

`xml.parsers.expat.model.``XML_CTYPE_CHOICE`

  指定されたエレメントはいくつかのオプションから選択できるようになっています; `(A | B | C)` のような内容モデルで用いられます。

`xml.parsers.expat.model.``XML_CTYPE_EMPTY`

  `EMPTY` であると宣言されている要素はこのモデル型を持ちます。

`xml.parsers.expat.model.``XML_CTYPE_MIXED`

`xml.parsers.expat.model.``XML_CTYPE_NAME`

`xml.parsers.expat.model.``XML_CTYPE_SEQ`

  順々に続くようなモデルの系列を表すモデルがこのモデル型で表されます。 `(A, B, C)` のようなモデルで用いられます。

限定子グループにおける定数を以下に示します:

`xml.parsers.expat.model.``XML_CQUANT_NONE`

  修飾子 (modifier) が指定されていません。従って `A` のように、厳密に一つだけです。

`xml.parsers.expat.model.``XML_CQUANT_OPT`

  このモデルはオプションです: `A?` のように、一つか全くないかです。

`xml.parsers.expat.model.``XML_CQUANT_PLUS`

  このモデルは (`A+` のように) 一つかそれ以上あります。

`xml.parsers.expat.model.``XML_CQUANT_REP`

  このモデルは `A*` のようにゼロ回以上あります。

## Expat エラー定数

以下の定数は `xml.parsers.expat.errors` モジュールで提供されています。 これらの定数は、エラーが発生した際に送出される `ExpatError` 例外オブジェクトのいくつかの属性を解釈する上で便利です。 後方互換性の理由で、定数値は数字のエラー コード ではなくエラー メッセージ です。 属性を解釈するには `code` 属性と `errors.codes[errors.XML_ERROR_CONSTANT_NAME]` を比較します。

`errors` モジュールには以下の属性があります:

`xml.parsers.expat.errors.``codes`

  文字列の記述をエラーコードに対応させる辞書です。

  バージョン 3.2 で追加.

`xml.parsers.expat.errors.``messages`

  数値的なエラーコードを文字列の記述に対応させる辞書です。

  バージョン 3.2 で追加.

`xml.parsers.expat.errors.``XML_ERROR_ASYNC_ENTITY`

`xml.parsers.expat.errors.``XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF`

  属性値中のエンティティ参照が、内部エンティティではなく外部エンティティを参照しました。

`xml.parsers.expat.errors.``XML_ERROR_BAD_CHAR_REF`

  文字参照が、XML では正しくない (illegal) 文字を参照しました (例えば `0` や '`&#0;`')。

`xml.parsers.expat.errors.``XML_ERROR_BINARY_ENTITY_REF`

  エンティティ参照が、記法 (notation) つきで宣言されているエンティティを参照したため、解析できません。

`xml.parsers.expat.errors.``XML_ERROR_DUPLICATE_ATTRIBUTE`

  一つの属性が一つの開始タグ内に一度より多く使われています。

`xml.parsers.expat.errors.``XML_ERROR_INCORRECT_ENCODING`

`xml.parsers.expat.errors.``XML_ERROR_INVALID_TOKEN`

  入力されたバイトが文字に適切に関連付けできない際に送出されます; 例えば、UTF-8 入力ストリームにおける NUL バイト (値 `0`) などです。

`xml.parsers.expat.errors.``XML_ERROR_JUNK_AFTER_DOC_ELEMENT`

  空白以外の何かがドキュメント要素の後にあります。

`xml.parsers.expat.errors.``XML_ERROR_MISPLACED_XML_PI`

  入力データの先頭以外の場所に XML 定義が見つかりました。

`xml.parsers.expat.errors.``XML_ERROR_NO_ELEMENTS`

  この文書には要素がありません (XML では全ての文書は確実に最上位の要素を正確に一つ持たなければなりません)。

`xml.parsers.expat.errors.``XML_ERROR_NO_MEMORY`

  Expat が内部メモリを確保できませんでした。

`xml.parsers.expat.errors.``XML_ERROR_PARAM_ENTITY_REF`

  パラメータエンティティが許可されていない場所で見つかりました。

`xml.parsers.expat.errors.``XML_ERROR_PARTIAL_CHAR`

  入力に不完全な文字が見つかりました。

`xml.parsers.expat.errors.``XML_ERROR_RECURSIVE_ENTITY_REF`

  エンティティ参照中に、同じエンティティへの別の参照が入っていました; おそらく違う名前で参照しているか、間接的に参照しています。

`xml.parsers.expat.errors.``XML_ERROR_SYNTAX`

  何らかの仕様化されていない構文エラーに遭遇しました。

`xml.parsers.expat.errors.``XML_ERROR_TAG_MISMATCH`

  終了タグが最も内側で開かれている開始タグに一致しません。

`xml.parsers.expat.errors.``XML_ERROR_UNCLOSED_TOKEN`

  何らかの (開始タグのような) トークンが閉じられないまま、ストリームの終端や次のトークンに遭遇しました。

`xml.parsers.expat.errors.``XML_ERROR_UNDEFINED_ENTITY`

  定義されていないエンティティへの参照が行われました。

`xml.parsers.expat.errors.``XML_ERROR_UNKNOWN_ENCODING`

  ドキュメントのエンコードが Expat でサポートされていません。

`xml.parsers.expat.errors.``XML_ERROR_UNCLOSED_CDATA_SECTION`

  CDATAセクションが閉じられていません。

`xml.parsers.expat.errors.``XML_ERROR_EXTERNAL_ENTITY_HANDLING`

`xml.parsers.expat.errors.``XML_ERROR_NOT_STANDALONE`

  XML文書が "standalone" だと宣言されており `NotStandaloneHandler` が設定され `0` が返されているにもかかわらず、パーサは "standalone" ではないと判別しました。

`xml.parsers.expat.errors.``XML_ERROR_UNEXPECTED_STATE`

`xml.parsers.expat.errors.``XML_ERROR_ENTITY_DECLARED_IN_PE`

`xml.parsers.expat.errors.``XML_ERROR_FEATURE_REQUIRES_XML_DTD`

  その操作を完了するにはDTDのサポートが必要ですが、ExpatがDTDのサポートをしない設定になっています。これは `xml.parsers.expat` モジュールの標準的なビルドでは報告されません。

`xml.parsers.expat.errors.``XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING`

  パースが始まったあとで動作の変更が要求されました。これはパースが開始される前にのみ変更可能です。（現在のところ） `UseForeignDTD()` によってのみ送出されます。

`xml.parsers.expat.errors.``XML_ERROR_UNBOUND_PREFIX`

  名前空間の処理を有効すると宣言されていないプレフィックスが見つかります。

`xml.parsers.expat.errors.``XML_ERROR_UNDECLARING_PREFIX`

  XML文書はプレフィックスに対応した名前空間宣言を削除しようとしました。

`xml.parsers.expat.errors.``XML_ERROR_INCOMPLETE_PE`

  パラメータエンティティは不完全なマークアップを含んでいます。

`xml.parsers.expat.errors.``XML_ERROR_XML_DECL`

  XML文書中に要素がありません。

`xml.parsers.expat.errors.``XML_ERROR_TEXT_DECL`

  外部エンティティ中のテキスト宣言にエラーがあります。

`xml.parsers.expat.errors.``XML_ERROR_PUBLICID`

  パブリックID中に許可されていない文字があります。

`xml.parsers.expat.errors.``XML_ERROR_SUSPENDED`

  要求された操作は一時停止されたパーサで行われていますが、許可されていない操作です。このエラーは追加の入力を行なおうとしている場合、もしくはパーサが停止しようとしている場合にも送出されます。

`xml.parsers.expat.errors.``XML_ERROR_NOT_SUSPENDED`

  パーサを一時停止しようとしましたが、停止されませんでした。

`xml.parsers.expat.errors.``XML_ERROR_ABORTED`

  Pythonアプリケーションには通知されません。

`xml.parsers.expat.errors.``XML_ERROR_FINISHED`

  要求された操作で、パース対象となる入力が完了したと判断しましたが、入力は受理されませんでした。このエラーは追加の入力を行なおうとしている場合、もしくはパーサが停止しようとしている場合に送出されます。

`xml.parsers.expat.errors.``XML_ERROR_SUSPEND_PE`

脚注

1

  XML 出力に含まれるエンコーディング文字列は適切な規格に従っていなければなりません。例えば、 "UTF-8" は有効ですが、 "UTF8" はそうではありません。https://www.w3.org/TR/2006/REC-xml11-20060816/#NT-EncodingDecl と https://www.iana.org/assignments/character-sets/character-sets.xhtml を参照してください。