转义字符串中使用XML(Escaping strings for use in XML)

2019-07-21 20:25发布

我使用Python的xml.dom.minidom创建一个XML文档。 (逻辑结构 - > XML字符串,而不是相反。)

我如何使它逃避我提供,使他们不能把事情弄糟XML字符串?

Answer 1:

你的意思是你做这样的事情:

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>'


Answer 2:

像这样的事情?

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


Answer 3:

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的答案。



Answer 4:

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不字符串替换



Answer 5:

如果你不希望其他项目导入和你已经拥有cgi ,你可以这样做:

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

但是请注意,这段代码的可读性受到影响 - 你应该把它放在一个函数来更好地描述你的意图:(和编写单元测试它,而你在它;)

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


文章来源: Escaping strings for use in XML