xml.parsers.expat — Expatを使用した高速XML解析—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.8/library/pyexpat
移動先:案内検索

xml.parsers.expat —Expatを使用した高速XML解析


警告

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


xml.parsers.expat モジュールは、Expat非検証XMLパーサーへのPythonインターフェースです。 このモジュールは、XMLパーサーの現在の状態を表す単一の拡張タイプxmlparserを提供します。 xmlparserオブジェクトを作成した後、オブジェクトのさまざまな属性をハンドラー関数に設定できます。 その後、XMLドキュメントがパーサーに送られると、XMLドキュメント内の文字データとマークアップに対してハンドラー関数が呼び出されます。

このモジュールは、pyexpatモジュールを使用して、Expatパーサーへのアクセスを提供します。 pyexpatモジュールを直接使用することは非推奨です。

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

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 が指定されている場合、ドキュメントの暗黙的または明示的なエンコーディングが上書きされます。

Expatは、オプションでXML名前空間処理を実行できます。これは、 namespace_separator の値を指定することで有効になります。 値は1文字の文字列である必要があります。 文字列の長さが不正な場合、 ValueError が発生します(Noneは省略と同じと見なされます)。 名前空間処理を有効にすると、名前空間に属する要素タイプ名と属性名が展開されます。 要素ハンドラーStartElementHandlerおよびEndElementHandlerに渡される要素名は、名前空間URI、名前空間区切り文字、および名前のローカル部分を連結したものになります。 名前空間の区切り文字がゼロバイト(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を呼び出して、一意のパーサーインスタンスを提供します。

も参照してください

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


XMLParserオブジェクト

xmlparserオブジェクトには次のメソッドがあります。

xmlparser.Parse(data[, isfinal])
文字列 data の内容を解析し、適切なハンドラー関数を呼び出して、解析されたデータを処理します。 isfinal は、このメソッドの最後の呼び出しでtrueである必要があります。 複数のファイルを送信するのではなく、フラグメント内の単一のファイルを解析できます。 data はいつでも空の文字列にすることができます。
xmlparser.ParseFile(file)
オブジェクトファイルから読み取ったXMLデータを解析します。 file は、read(nbytes)メソッドを提供するだけでよく、データがなくなると空の文字列を返します。
xmlparser.SetBase(base)
宣言内のシステム識別子の相対URIを解決するために使用されるベースを設定します。 相対識別子の解決はアプリケーションに任されています。この値は、 base 引数として ExternalEntityRefHandler()NotationDeclHandler()、およびに渡されます。 ] UnparsedEntityDeclHandler()関数。
xmlparser.GetBase()
SetBase()の前回の呼び出しで設定されたベースを含む文字列を返します。 SetBase()が呼び出されていない場合は、Noneを返します。
xmlparser.GetInputContext()
現在のイベントを生成した入力データを文字列として返します。 データは、テキストを含むエンティティのエンコーディングにあります。 イベントハンドラーがアクティブでないときに呼び出された場合、戻り値はNoneです。
xmlparser.ExternalEntityParserCreate(context[, encoding])
親パーサーによって解析されたコンテンツによって参照される外部の解析されたエンティティを解析するために使用できる「子」パーサーを作成します。 context パラメーターは、以下で説明する ExternalEntityRefHandler()ハンドラー関数に渡される文字列である必要があります。 子パーサーは、 ordered_attributes および specified_attributes がこのパーサーの値に設定された状態で作成されます。
xmlparser.SetParamEntityParsing(flag)
パラメータエンティティ(外部DTDサブセットを含む)の解析を制御します。 可能なフラグ値は、XML_PARAM_ENTITY_PARSING_NEVERXML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE、およびXML_PARAM_ENTITY_PARSING_ALWAYSです。 フラグの設定が成功した場合はtrueを返します。
xmlparser.UseForeignDTD([flag])

フラグ(デフォルト)の真の値でこれを呼び出すと、Expatはすべての引数に対して ExternalEntityRefHandlerNone で呼び出し、代替DTDをロードできるようにします。 。 ドキュメントにドキュメント型宣言が含まれていない場合でも、 ExternalEntityRefHandler は呼び出されますが、 StartDoctypeDeclHandler および EndDoctypeDeclHandler は呼び出されません。

flag にfalse値を渡すと、true値を渡した前の呼び出しがキャンセルされますが、それ以外の場合は効果がありません。

このメソッドは、 Parse()または ParseFile()メソッドが呼び出される前にのみ呼び出すことができます。 これらのいずれかが呼び出された後に呼び出すと、[X120X] code 属性がerrors.codes[errors.XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING]に設定された状態で ExpatError が発生します。

xmlparserオブジェクトには次の属性があります。

xmlparser.buffer_size
buffer_text がtrueの場合に使用されるバッファーのサイズ。 この属性に新しい整数値を割り当てることにより、新しいバッファサイズを設定できます。 サイズが変更されると、バッファがフラッシュされます。
xmlparser.buffer_text
これをtrueに設定すると、xmlparserオブジェクトはExpatから返されたテキストコンテンツをバッファリングし、可能な限り CharacterDataHandler()コールバックへの複数の呼び出しを回避します。 Expatは通常、行末ごとに文字データをチャンクに分割するため、これによりパフォーマンスを大幅に向上させることができます。 この属性はデフォルトではfalseであり、いつでも変更できます。
xmlparser.buffer_used
buffer_text が有効になっている場合、バッファーに格納されているバイト数。 これらのバイトは、UTF-8でエンコードされたテキストを表します。 buffer_text がfalseの場合、この属性には意味のある解釈がありません。
xmlparser.ordered_attributes
この属性をゼロ以外の整数に設定すると、属性はディクショナリではなくリストとして報告されます。 属性は、ドキュメントテキストに記載されている順序で表示されます。 属性ごとに、属性名と属性値の2つのリストエントリが表示されます。 (このモジュールの古いバージョンもこの形式を使用していました。)デフォルトでは、この属性はfalseです。 いつでも変更できます。
xmlparser.specified_attributes
ゼロ以外の整数に設定されている場合、パーサーはドキュメントインスタンスで指定された属性のみを報告し、属性宣言から派生した属性は報告しません。 これを設定するアプリケーションは、XMLプロセッサの動作の標準に準拠するために、必要に応じて宣言から利用できる追加情報を使用するように特に注意する必要があります。 デフォルトでは、この属性はfalseです。 いつでも変更できます。

次の属性には、xmlparserオブジェクトで発生した最新のエラーに関連する値が含まれており、Parse()またはParseFile()の呼び出しで[X196X ] xml.parsers.expat.ExpatError 例外。

xmlparser.ErrorByteIndex
エラーが発生したバイトインデックス。
xmlparser.ErrorCode
問題を指定する数値コード。 この値は、 ErrorString()関数に渡すか、errorsオブジェクトで定義されている定数の1つと比較できます。
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推奨の該当するバージョンの(オプションの)宣言、ドキュメントテキストのエンコード、およびオプションの「スタンドアロン」宣言です。 バージョンエンコーディングは文字列になり、スタンドアロンはドキュメントがスタンドアロンとして宣言されている場合は1になり、0はスタンドアロンとして宣言されている場合になりますスタンドアロンではないと宣言されているか、スタンドアロン句が省略されている場合は-1。 これは、Expatバージョン1.95.0以降でのみ使用できます。
xmlparser.StartDoctypeDeclHandler(doctypeName, systemId, publicId, has_internal_subset)
Expatが文書型宣言(<!DOCTYPE ...)の解析を開始したときに呼び出されます。 doctypeName は、表示されているとおりに提供されます。 systemId および publicId パラメーターは、指定されている場合はシステムIDとパブリックIDを、省略されている場合はNoneを指定します。 has_internal_subset は、ドキュメントに内部ドキュメント宣言サブセットが含まれている場合にtrueになります。 これには、Expatバージョン1.2以降が必要です。
xmlparser.EndDoctypeDeclHandler()
Expatが文書型宣言の解析を完了したときに呼び出されます。 これには、Expatバージョン1.2以降が必要です。
xmlparser.ElementDeclHandler(name, model)
要素タイプ宣言ごとに1回呼び出されます。 name は要素タイプの名前であり、 model はコンテンツモデルの表現です。
xmlparser.AttlistDeclHandler(elname, attname, type, default, required)
要素タイプの宣言された属性ごとに呼び出されます。 属性リスト宣言が3つの属性を宣言している場合、このハンドラーは属性ごとに1回ずつ、3回呼び出されます。 elname は宣言が適用される要素の名前であり、 attname は宣言された属性の名前です。 属性タイプは、 type として渡される文字列です。 可能な値は'CDATA''ID''IDREF'、… default は、属性がドキュメントで指定されていない場合に使用される属性のデフォルト値を示します。インスタンス、またはデフォルト値(#IMPLIED値)がない場合はNone。 ドキュメントインスタンスで属性を指定する必要がある場合、 required はtrueになります。 これには、Expatバージョン1.95.0以降が必要です。
xmlparser.StartElementHandler(name, attributes)
すべての要素の開始を求められます。 name は要素名を含む文字列であり、 attributes は要素属性です。 ordered_attributes がtrueの場合、これはリストです(詳細については、 ordered_attributes を参照してください)。 それ以外の場合は、名前を値にマッピングする辞書です。
xmlparser.EndElementHandler(name)
すべての要素の終わりを求められます。
xmlparser.ProcessingInstructionHandler(target, data)
すべての処理命令に対して呼び出されます。
xmlparser.CharacterDataHandler(data)
文字データが必要です。 これは、通常の文字データ、CDATAでマークされたコンテンツ、および無視できる空白に対して呼び出されます。 これらのケースを区別する必要があるアプリケーションは、 StartCdataSectionHandlerEndCdataSectionHandler 、および 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になり、解析されていないエンティティの場合は表記の名前になります。 is_parameter_entity は、エンティティがパラメータエンティティの場合はtrueになり、一般エンティティの場合はfalseになります(ほとんどのアプリケーションは一般エンティティにのみ関係する必要があります)。 これは、Expatライブラリのバージョン1.95.0以降でのみ使用できます。
xmlparser.NotationDeclHandler(notationName, base, systemId, publicId)
表記宣言が必要です。 notationNamebasesystemId 、および publicId は、指定されている場合は文字列です。 公開識別子を省略すると、 publicIdNoneになります。
xmlparser.StartNamespaceDeclHandler(prefix, uri)
要素に名前空間宣言が含まれている場合に呼び出されます。 名前空間宣言は、宣言が配置されている要素に対して StartElementHandler が呼び出される前に処理されます。
xmlparser.EndNamespaceDeclHandler(prefix)
名前空間宣言を含む要素の終了タグに到達したときに呼び出されます。 これは、 StartNamespaceDeclHandler が呼び出された順序とは逆に、要素の名前空間宣言ごとに1回呼び出され、各名前空間宣言のスコープの開始を示します。 このハンドラーの呼び出しは、要素の終わりに対応する EndElementHandler の後に行われます。
xmlparser.CommentHandler(data)
コメントを求めた。 data はコメントのテキストであり、先頭の'<!- -'と末尾の'- ->'は除きます。
xmlparser.StartCdataSectionHandler()
CDATAセクションの開始時に呼び出されます。 これと EndCdataSectionHandler は、CDATAセクションの構文上の開始と終了を識別できるようにするために必要です。
xmlparser.EndCdataSectionHandler()
CDATAセクションの最後に呼び出されます。
xmlparser.DefaultHandler(data)
適用可能なハンドラーが指定されていないXMLドキュメント内のすべての文字に対して呼び出されます。 これは、報告される可能性があるが、ハンドラーが提供されていない構成の一部である文字を意味します。
xmlparser.DefaultHandlerExpand(data)
これは DefaultHandler()と同じですが、内部エンティティの拡張を禁止しません。 エンティティ参照はデフォルトのハンドラーに渡されません。
xmlparser.NotStandaloneHandler()
XMLドキュメントがスタンドアロンドキュメントとして宣言されていない場合に呼び出されます。 これは、外部サブセットまたはパラメーターエンティティへの参照があるが、XML宣言でスタンドアロンがyesに設定されていない場合に発生します。 このハンドラーが0を返す場合、パーサーはXML_ERROR_NOT_STANDALONEエラーを発生させます。 このハンドラーが設定されていない場合、パーサーはこの条件に対して例外を発生させません。
xmlparser.ExternalEntityRefHandler(context, base, systemId, publicId)

外部エンティティへの参照を求められます。 base は、 SetBase()への前回の呼び出しで設定された現在のベースです。 パブリック識別子とシステム識別子 systemIdpublicId は、指定されている場合は文字列です。 公開識別子が指定されていない場合、 publicIdNoneになります。 context 値は不透明であり、以下で説明するようにのみ使用する必要があります。

外部エンティティを解析するには、このハンドラーを実装する必要があります。 ExternalEntityParserCreate(context)を使用してサブパーサーを作成し、適切なコールバックで初期化し、エンティティを解析します。 このハンドラーは整数を返す必要があります。 0を返す場合、パーサーはXML_ERROR_EXTERNAL_ENTITY_HANDLINGエラーを発生させます。それ以外の場合、解析は続行されます。

このハンドラーが提供されていない場合、外部エンティティは 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 モジュールは、エラーメッセージ定数と、これらのメッセージをエラーコードにマッピングする辞書 code も提供します。以下を参照してください。

ExpatError.lineno
エラーが検出された行番号。 最初の行には1という番号が付けられています。
ExpatError.offset
エラーが発生した行への文字オフセット。 最初の列には0という番号が付けられています。


次のプログラムは、引数を出力する3つのハンドラーを定義します。

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つの値が含まれています。 子は単に追加のコンテンツモデルの説明です。

最初の2つのフィールドの値は、 xml.parsers.expat.model モジュールで定義されている定数です。 これらの定数は、モデルタイプグループと数量詞グループの2つのグループに収集できます。

モデルタイプグループの定数は次のとおりです。

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
修飾子が指定されていないため、Aのように1回だけ表示できます。
xml.parsers.expat.model.XML_CQUANT_OPT
モデルはオプションです。A?の場合と同様に、一度だけ表示することも、まったく表示しないこともできます。
xml.parsers.expat.model.XML_CQUANT_PLUS
モデルは1回以上発生する必要があります(A+など)。
xml.parsers.expat.model.XML_CQUANT_REP
A*の場合と同様に、モデルは0回以上出現する必要があります。


エクスパットエラー定数

次の定数は、 xml.parsers.expat.errors モジュールで提供されます。 これらの定数は、エラーが発生したときに発生したExpatError例外オブジェクトの属性の一部を解釈するのに役立ちます。 下位互換性の理由から、定数の値はエラーメッセージであり、数値エラーコードではないため、コード属性を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で無効な文字を参照する文字参照(たとえば、文字0または '&#0;')。
xml.parsers.expat.errors.XML_ERROR_BINARY_ENTITY_REF
エンティティ参照は、表記で宣言されたエンティティを参照しているため、解析できません。
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では、すべてのドキュメントに1つの最上位要素が含まれている必要があります)。
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宣言内にあると宣言したにもかかわらず、ドキュメントが「スタンドアロン」ではないと判断し、NotStandaloneHandlerが設定され、0が返されました。
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.parsers.expat.errors.XML_ERROR_INCOMPLETE_PE
パラメータエンティティに不完全なマークアップが含まれていました。
xml.parsers.expat.errors.XML_ERROR_XML_DECL
ドキュメントにはドキュメント要素がまったく含まれていませんでした。
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