質問

Python expat を使用して XML ファイルを解析しようとしています。XML ファイルに次の行があります。

<Action>&lt;fail/&gt;</Action>

expat は開始タグと終了タグを識別しますが、< は変換します。より小さい文字に対しては同じであり、より大きい文字に対しても同様であるため、次のように解析されます。

結果:

START 'Action'
DATA '<'
DATA 'fail/'
DATA '>'
END 'Action'

望ましい代わりに:

START 'Action'
DATA '&lt;fail/&gt;'
END 'Action'

望ましい結果を得たいのですが、駐在員が失敗しないようにするにはどうすればよいですか?

役に立ちましたか?

解決

外国人は混乱しない、 &lt; 単に文字の XML エンコーディングです <. 。まったく逆に、expat がリテラルを返す場合は、 &lt;, 、これは XML 仕様に関するバグです。そうは言っても、もちろん、次を使用してエスケープされたバージョンを元に戻すことができます。 xml.sax.saxutils.escape:

>>> from xml.sax.saxutils import escape
>>> escape("<fail/>")
'&lt;fail/&gt;'

expat パーサーは、すべての文字列データを適切と思われるチャンクで自由にレポートできるため、それらを自分で連結する必要があります。

他のヒント

SAX パーサーと StAX パーサーはどちらも、都合のよい方法で文字列を自由に分割できます (ただし、StAX には、部分を強制的に組み立てるための COALESCE モードがあります)。

その理由は、特定のケースではストリーミングを行い、文字列フラグメントの再構築のオーバーヘッドを気にする必要がないソフトウェアを作成できることが多いためです。

通常、テキストを変数に蓄積し、次の StartElement または EndElement イベントが表示されたときにその内容を使用します。この時点で、accumulated-text 変数も空にリセットしました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top