2009-10-10 2 views
25

私はPythonのxml.dom.minidomを使ってXML文書を作成しています。 (論理構造 - > XML文字列、それ以外の方法ではありません)Python:XMLで使用する文字列をエスケープする

私はそれがXMLを台無しにすることができないように私が提供する文字列をエスケープする方法を教えてください?

+2

すべてのXML DOMシリアライザは、マークアップを使用して手を汚さないために、DOM操作を行うためのものです。 – bobince

答えて

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

+9

引用符のエスケープは処理されません。 – e1i45

+1

>>> xml.sax.saxutilsからはquoteattr "二重引用符\「とアポストロフィを含む >>> quoteattr(「を含む値 "二重引用符\」とアポストロフィ ') 」"値をインポート" – user1048839

3

を、あなた既にcgiがある場合は、次のように使用できます。

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

このコードの読みやすさが苦しんでいることが注意 - あなたは、おそらくより良いあなたの意図を記述するための機能でそれを置くべきである。(あなたはそれでいる間、それのためのユニットテストを書く;)

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

xml.sax引用文字( ")だからここ

をエスケープしない.saxutilsは別のものです:あなたはそれを見て、その後xml.sax.saxutils場合

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

のみ文字列が

を置き換えません210
+1

単一引用符文字をエスケープしたい場合があります。 ' – Petri

+0

キーワード' str'を変数として使用しないでください名。 – twasbrillig

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の答えに示されているように、自分自身の機能です。

関連する問題