Pythonのxml.dom.minidom
を使用してXMLドキュメントを作成しています。 (論理構造-> XML文字列、その逆ではありません。)
提供する文字列をエスケープして、XMLをめちゃくちゃにしないようにするにはどうすればよいですか?
あなたはこのようなことをするつもりですか?
from xml.dom.minidom import Text, Element
t = Text()
e = Element('p')
t.data = '<bar><a/><baz spam="eggs"> & blabla &entity;</>'
e.appendChild(t)
次に、うまくエスケープされたXML文字列を取得します。
>>> e.toxml()
'<p><bar><a/><baz spam="eggs"> & blabla &entity;</></p>'
このようなもの?
>>> from xml.sax.saxutils import escape
>>> escape("< & >")
'< & >'
_xml.sax.saxutils.escape
_は、デフォルトでは_&
_、_<
_、および_>
_のみをエスケープしますが、他の文字列をさらにエスケープするentities
パラメーターを提供します。
_from xml.sax.saxutils import escape
def xmlescape(data):
return escape(data, entities={
"'": "'",
"\"": """
})
_
_xml.sax.saxutils.escape
_は内部でstr.replace()
を使用するため、インポートをスキップして、MichealMoserの回答に示すように独自の関数を作成することもできます。
xml.sax.saxutilsが引用文字( ")をエスケープしない
ここに別のものがあります:
def escape( str ):
str = str.replace("&", "&")
str = str.replace("<", "<")
str = str.replace(">", ">")
str = str.replace("\"", """)
return str
あなたがそれを調べれば、xml.sax.saxutilsは文字列を置き換えるだけです
別のプロジェクトのインポートが不要で、すでにcgi
がある場合は、これを使用できます。
>>> import cgi
>>> cgi.escape("< & >")
'< & >'
ただし、このコードでは読みやすさが低下することに注意してください。意図をより適切に説明するために、おそらくコードに関数を挿入する必要があります(そして、その中にユニットテストを記述してください;)。
def xml_escape(s):
return cgi.escape(s) # escapes "<", ">" and "&"