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