2009-10-10 76 views
25

我使用Python的xml.dom.minidom创建一个XML文档。 (逻辑结构 - > XML字符串,而不是其他方式)的Python:摆脱使用字符串XML

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

+2

任何XML DOM串行器将相应地转义字符的数据,因为它熄灭......这就是DOM操作是,防止你不必把你的手脏的标记。 – bobince 2009-10-10 01:56:30

回答

10

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

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

像这样的事情?

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

正是我在找的东西。我的大部分XML处理都是使用lxml完成​​的,我想知道是否导入(但是)另一个XML模块会被污染太多?在lxml中有相同的吗? (似乎无法找到一个。) – Jens 2013-08-17 02:52:34

+9

这不处理引号逃逸。 – e1i45 2014-01-24 15:42:28

+1

>>>从xml.sax.saxutils导入quoteattr >>> quoteattr含有"一个双引号\“和一个撇号(“值包含“双引号\”和一个撇号') ””值“‘ – user1048839 2016-05-06 09:50:05

3

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

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

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

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

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

+1

可能要逃​​跑也单引号字符,即’ – Petri 2016-10-12 09:52:40

+0

最好避免使用关键字'str'为您的变量名称。 – twasbrillig 2017-03-15 20:06:09

8

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