モジュールを使用lxmlして、Python で XML ファイルを生成します。
外部システムで解析されるいくつかのエンティティ参照を定義する必要があります。通常、要素のすべてのテキスト文字列は、出力時に XML 文字列にエスケープされます。
from lxml import etree
root = etree.Element("root")
sub = etree.Element("sub")
sub.text = "&entity;text"
root.append(sub)
print etree.tostring(root)
'<root><sub>&entity;text</sub></root>' # I want to get without escaping
lxml.etree.Entityクラスがこの目的に役立つことがわかりました。
root = etree.Element("root")
sub = etree.Element("sub")
entity = etree.Entity("entity")
entity.tail = "text"
sub.append(entity)
root.append(sub)
print etree.tostring(root)
'<root><sub>&entity;text</sub></root>'
ただし、属性の値へのエンティティ参照を含むテキストを設定すると、失敗します。
root = etree.Element("root")
sub = etree.Element("sub")
entity = etree.Entity("entity")
entity.tail = "text"
sub.attrib["foo"] = entity
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-52-62cb8ef3a9a6> in <module>()
----> 1 sub.attrib["foo"] = entity
lxml.etree.pyx in lxml.etree._Attrib.__setitem__ (src/lxml/lxml.etree.c:58775)()
apihelpers.pxi in lxml.etree._setAttributeValue (src/lxml/lxml.etree.c:19025)()
apihelpers.pxi in lxml.etree._utf8 (src/lxml/lxml.etree.c:26460)()
TypeError: Argument must be bytes or unicode, got '_Entity'
私が取得したいのは次のようなものです:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE foo [
<!ENTITY ent "entity" >
<!ENTITY aaa "aaaaaa" >
]>
<foo>
<sub bar="&ent;bas">&aaa;bbb</sub>
<foo>
そのためのジェネレーターをどのように定義できますか?