lxml で解析中に外部の未解析エンティティを解決するにはどうすればよいですか?
これが私のコード例です:
import io
from lxml import etree
content = b"""\
<?xml version="1.0"?>
<!DOCTYPE sample [
<!NOTATION jpeg SYSTEM "image/jpeg">
<!ENTITY ref1 SYSTEM "python-logo-small.jpg" NDATA jpeg>
<!ELEMENT sample EMPTY>
<!ATTLIST sample src ENTITY #REQUIRED>
]>
<sample src="ref1"/>
"""
parser = etree.XMLParser(dtd_validation=True, resolve_entities=True)
doc = etree.parse(io.BytesIO(content), parser=parser)
print(etree.tostring(doc))
注: lxml >= 3.4 を使用しています
現在、次の結果があります。
<!DOCTYPE sample [
<!NOTATION jpeg SYSTEM "image/jpeg" >
<!ENTITY ref1 SYSTEM "python-logo-small.jpg" NDATA jpeg>
<!ELEMENT sample EMPTY>
<!ATTLIST sample src ENTITY #REQUIRED>
]>
<sample src="ref1"/>
ここでは、ref1
エンティティは「python-logo-small.jpg」に解決されていません。私は持っていると思ってい<sample src="python-logo-small.jpg"/>
ました。何か問題がありますか?
私も試してみます:
parser = etree.XMLParser(dtd_validation=True, resolve_entities=True, load_dtd=True)
しかし、私は同じ結果を持っています。
または、エンティティを自分で再ソールしたいと思います。そのために、エンティティを次のようにリストします。
for entity in doc.docinfo.internalDTD.iterentities():
msg_fmt = "{entity.name!r}, {entity.content!r}, {entity.orig!r}"
print(msg_fmt.format(entity=entity))
しかし、エンティティの定義ではなく、エンティティと表記の名前のみを取得します。
'ref1', 'jpeg', None
エンティティの定義にアクセスするには?