web-dev-qa-db-ja.com

XMLで使用するための文字列のエスケープ

Pythonのxml.dom.minidomを使用してXMLドキュメントを作成しています。 (論理構造-> XML文字列、その逆ではありません。)

提供する文字列をエスケープして、XMLをめちゃくちゃにしないようにするにはどうすればよいですか?

31
Ram Rachum

あなたはこのようなことをするつもりですか?

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>&lt;bar&gt;&lt;a/&gt;&lt;baz spam=&quot;eggs&quot;&gt; &amp; blabla &amp;entity;&lt;/&gt;</p>'
12

このようなもの?

>>> from xml.sax.saxutils import escape
>>> escape("< & >")   
'&lt; &amp; &gt;'
66
mbarkhau

_xml.sax.saxutils.escape_は、デフォルトでは_&_、_<_、および_>_のみをエスケープしますが、他の文字列をさらにエスケープするentitiesパラメーターを提供します。

_from xml.sax.saxutils import escape

def xmlescape(data):
    return escape(data, entities={
        "'": "&apos;",
        "\"": "&quot;"
    })
_

_xml.sax.saxutils.escape_は内部でstr.replace()を使用するため、インポートをスキップして、MichealMoserの回答に示すように独自の関数を作成することもできます。

12
K L

xml.sax.saxutilsが引用文字( ")をエスケープしない

ここに別のものがあります:

def escape( str ):
    str = str.replace("&", "&amp;")
    str = str.replace("<", "&lt;")
    str = str.replace(">", "&gt;")
    str = str.replace("\"", "&quot;")
    return str

あなたがそれを調べれば、xml.sax.saxutilsは文字列を置き換えるだけです

11
MichaelMoser

別のプロジェクトのインポートが不要で、すでにcgiがある場合は、これを使用できます。

>>> import cgi
>>> cgi.escape("< & >")
'&lt; &amp; &gt;'

ただし、このコードでは読みやすさが低下することに注意してください。意図をより適切に説明するために、おそらくコードに関数を挿入する必要があります(そして、その中にユニットテストを記述してください;)。

def xml_escape(s):
    return cgi.escape(s) # escapes "<", ">" and "&"
4
johndodo