2009-10-10 11 views
25

XML belgesi oluşturmak için Python xml.dom.minidom kullanıyorum. (Mantıksal yapı -> XML dizgisi, etrafta başka bir yol değil.) Xzx6 Python: XML'de kullanmak için dizelerden kaçınıyor

Verdiğim dizelerden nasıl çıkarım? Böylece XML'i dağıtamayacaklar mı?

+2

Herhangi bir XML DOM serialiser uygun karakter verilerini kaçacaktır. – bobince

cevap

10

Eğer böyle bir şey yapmak anlamına mı:

from xml.dom.minidom import Text, Element 

t = Text() 
e = Element('p') 

t.data = '<bar><a/><baz spam="eggs"> & blabla &entity;</>' 
e.appendChild(t) 

Sonra güzel olsun XML dizesi kaçan olacak: Başka bir proje ithalat istemiyorsanız

>>> e.toxml() 
'<p>&lt;bar&gt;&lt;a/&gt;&lt;baz spam=&quot;eggs&quot;&gt; &amp; blabla &amp;entity;&lt;/&gt;</p>' 
60

böyle bir şey?

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

Sadece aradığım şey. XML işlemimin çoğu lxml kullanılarak yapılır ve başka bir XML modülünün içe aktarılmasının çok kirli olup olmadığını merak ediyorum. Lxml'de bir eşdeğer var mı? (Bir tane bulamıyor gibi görünmüyor.) – Jens

+9

Bu, tırnakların kaçmasını engellemez. aktar xml.sax.saxutils gelen – e1i45

+1

>>> " bir \ alıntı çift 've bir kesme işareti içeren quoteattr >>> quoteattr '" ' (ve bir kesme işareti, bir çift tırnak \ değeri içeren')'" değerini alın " 'Bu neden olacaktır – user1048839

3

ve zaten cgi var, bunu kullanabilirsiniz:

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

Not Ancak bu kod okunabilirlik uğrar o - muhtemelen daha iyi niyeti tarif etmek için işlevde koymak gerekir: (siz ona iken bunun için birim testleri ve yazma;)

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

xml.sax tırnak karakterleri (") Yani burada

kaçmıyor .saxutils başka biri: açın bakın sonra aktar xml.sax.saxutils eğer

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

ama dize

yerini alıyor 210
+1

da, yani tek tırnak karakteri kaçmak istiyorum olabilir' – Petri

+0

En sizin değişken olarak anahtar kelime' str' kullanmaktan kaçının ad. – twasbrillig

8

xml.sax.saxutils.escape sadece &, < ve varsayılan olarak > kaçar, ama ayrıca diğer dizeleri kaçmak için bir entities parametresini sağlamak yapar: Ayrıca ithalat atlayıp yazabilir böylece

from xml.sax.saxutils import escape 

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

xml.sax.saxutils.escape, içten str.replace() kullanır.Web MichealMoser'ın yanıtında gösterildiği gibi kendi işlevi. o ... o, DOM manipülasyon bunun için var İşaretleme ellerini kirletme durumunda kalmamak söndüğünde

İlgili konular