Pythonでエンティティの置換に.dtdを使用するようにexpatを取得する
-
04-10-2019 - |
質問
次のような XML ファイルを読み取ろうとしています
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE dblp SYSTEM "dblp.dtd">
<dblp>
<incollection>
<author>José A. Blakeley</author>
</incollection>
</dblp>
見た目の問題を引き起こすポイントは、
José A. Blakeley
一部:パーサーはその文字ハンドラーを 2 回呼び出します。1 回目は "Jos" で、もう 1 回目は " A.ブレイクリー」。これで、ecute エンティティを知らない場合は、これが正しい動作である可能性があることがわかりました。ただし、これは私が持っている dblp.dtd で定義されています。ただし、外国人にこのファイルを使用するよう説得することはできないようです。私が言えることはただ一つ
p = xml.parsers.expat.ParserCreate()
# tried with and without following line
p.SetParamEntityParsing(xml.parsers.expat.XML_PARAM_ENTITY_PARSING_ALWAYS)
p.UseForeignDTD(True)
f = open(dblp_file, "r")
p.ParseFile(f)
しかし、海外駐在員はまだ私の存在を認識していません。外国人にどの DTD を使用するかを伝える方法がないのはなぜですか?私はもう試した
- ファイルを XML と同じディレクトリに置く
- ファイルをプログラムの作業ディレクトリに置く
- XML ファイル内の参照を絶対パスに置き換えます。
私には何が欠けているのでしょうか?THX。
解決
私の理解では、pyexpat を直接使用している場合は、独自のファイルを提供する必要があります。 ExternalEntityRefHandler
外部 DTD をフェッチし、それを expat にフィードします。
例を参照してください。 xml.sax.expatreader
たとえば、コード (メソッド external_entity_ref
, 、Python 2.6 の 374 行目)。
おそらく、SAX などの上位レベルのインターフェイスを使用する方がよいでしょう ( expatreader
) できれば。
他のヒント
ところで、次のように、.dtd の関連部分を XML ファイル自体にコピーすることで、一時的に自分自身を助けることができます。
<!DOCTYPE dblp [
<!ENTITY Agrave "À" >
]>
しかし、それは一般的な方法では実際には問題を解決しません。
所属していません StackOverflow