2011-03-23 11 views
10

छोड़ने से fromstring मेरे पास है को रोकने के लिए कैसे:xml.ElementTree निम्नलिखित कोड टुकड़ा यद्यपि commentnode

from xml.etree.ElementTree import fromstring,tostring 
    mathml = fromstring(input) 
    for elem in mathml.getiterator(): 
     elem.tag = 'm:' + elem.tag 
    return tostring(mathml) 

जब मैं इनपुट input निम्नलिखित:

<math> 
    <a> 1 2 3 </a> <b /> 
<foo>Uitleg</foo> 
<!-- <bar> --> 
</math> 

यह परिणाम:

<m:math> 
    <m:a> 1 2 3 </m:a> <m:b /> 
<m:foo>Uitleg</m:foo> 

</m:math> 

कैसे आते हैं? और मैं टिप्पणी कैसे संरक्षित कर सकता हूं?

संपादित करें: मुझे सटीक एक्सएमएल लाइब्रेरी का उपयोग नहीं है, हालांकि, मुझे टैग में चिपकाए गए परिवर्तन को करने में सक्षम होना चाहिए। दुर्भाग्य से, lxml इस अनुमति देने के लिए, प्रतीत होता है नहीं है (और मैं उचित नाम स्थान के संचालन का उपयोग नहीं कर सकते हैं)

+2

मुझे नहीं लगता कि यह 'xml.etree' के वर्तमान कार्यान्वयन के साथ संभव है। टिप्पणी नोड्स पार्सर द्वारा शुरू करने के लिए छीन लिया जाता है। – Santa

+1

लेकिन फिर मुझे एक अलग पार्सर का उपयोग करके इसे हल करने में सक्षम होना चाहिए? (मान लीजिए कि कोई ऐसा नहीं है जो टिप्पणियां नहीं छोड़ता)। चूंकि एलिमेंटट्री में टिप्पणी नोड है, जिसे आप बना सकते हैं, इसलिए मुझे कहीं कुछ समर्थन की उम्मीद होगी। – markijbema

+1

यह सच है। 'xml.etree' * * एक टिप्पणी नोड बना सकता है और इसे एक्सएमएल में क्रमबद्ध कर सकता है, लेकिन दुर्भाग्यवश, इसके विपरीत पार्सर द्वारा रिवर्स समर्थित नहीं है। – Santa

उत्तर

14

xml.etree साथ आप नहीं कर सकते हैं क्योंकि इसके पार्सर टिप्पणियों पर ध्यान नहीं देता है (जो वैसे एक XML पार्सर के लिए स्वीकार्य व्यवहार है)। लेकिन यदि आप (संगत) lxml लाइब्रेरी का उपयोग कर सकते हैं, तो आप parser options को कॉन्फ़िगर करने की अनुमति दे सकते हैं।

from lxml import etree 

parser = etree.XMLParser(remove_comments=False) 
tree = etree.parse('input.xml', parser=parser) 
# or alternatively set the parser as default: 
# etree.set_default_parser(parser) 

यह अब तक का सबसे आसान विकल्प होगा। यदि आपको वास्तव में xml.etree का उपयोग करना है, तो आप अपने स्वयं के पार्सर को हुक अप करने का प्रयास कर सकते हैं, फिर भी, टिप्पणियां आधिकारिक रूप से समर्थित नहीं हैं: this example (xml.etree के लेखक से) पर एक नज़र डालें (अभी भी पाइथन में काम करना प्रतीत होता है 2.7 वैसे)

+0

ऐसा लगता है कि, lxml मेरे हैकी नेमस्पेस-एडिशन को अनुमति नहीं देता है (और मैं इसे ठीक से नहीं करना चाहता; मेरी एक्सएमएल फाइलें अज्ञात लिपियों द्वारा पोस्टप्रोसेस्ड हो जाती हैं, और मुझे उचित नामस्थान जोड़ने के नतीजे नहीं हैं, क्योंकि वे वर्तमान में उपयोग में नहीं हैं)। – markijbema

+0

आप xml.dom.minidom के साथ भी ऐसा कर सकते हैं; दोनों toxml() और toprettyxml() विधियों टिप्पणियों को संरक्षित करते हैं। (मैं आसानी से एलएक्सएमएल का उपयोग नहीं कर सकता क्योंकि मैं एक एड-ऑन लिख रहा हूं जो अधिमानतः क्रॉस-प्लेटफॉर्म होना चाहिए, जो शुद्ध पायथन का उपयोग करना सबसे आसान लगता है।) –

संबंधित मुद्दे