2009-10-10 15 views
25

में उपयोग के लिए तारों से बचने के लिए मैं एक XML दस्तावेज़ बनाने के लिए पाइथन के xml.dom.minidom का उपयोग कर रहा हूं। (तार्किक संरचना -> एक्सएमएल स्ट्रिंग, दूसरी तरफ नहीं।)पायथन: XML

मैं इसे प्रदान किए गए तारों से कैसे बचूं ताकि वे एक्सएमएल को गड़बड़ नहीं कर पाएंगे?

+2

कोई भी एक्सएमएल डोम सीरियलाइज़र चरित्र डेटा को उचित तरीके से बच जाएगा क्योंकि यह बाहर निकलता है ... यही कारण है कि आप डोम मैनिपुलेशन के लिए मार्कअप के साथ अपने हाथ गंदे होने से रोकने के लिए हैं। – 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) 

तो फिर तुम अच्छी तरह से मिल जाएगा एक्सएमएल स्ट्रिंग भाग निकले:

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

बस जो मैं खोज रहा था। मेरे अधिकांश एक्सएमएल हैंडलिंग एलएक्सएमएल का उपयोग करके किया जाता है और मुझे आश्चर्य है कि आयात (अभी तक) एक और एक्सएमएल मॉड्यूल बहुत प्रदूषित होगा? क्या एलएक्सएमएल में बराबर है? (एक को खोजने के लिए प्रतीत नहीं होता है।) – 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 उद्धरण वर्ण (")

तो यहाँ से बच नहीं करता है एक और एक है:

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

+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 के जवाब में दिखाए गए अनुसार, अपना कार्य।