2012-01-15 8 views
9

मैं इस सवाल में जवाब का उपयोग करने की कोशिश की है के साथ कैसे बनाएं, लेकिन यह काम नहीं कर सकते हैं:पायथन के cElementTree

import xml.etree.cElementTree as ElementTree 
from StringIO import StringIO 
s = '<?xml version=\"1.0\" encoding=\"UTF-8\" ?><!DOCTYPE tmx SYSTEM \"tmx14a.dtd\" ><tmx version=\"1.4a\" />' 
tree = ElementTree.parse(StringIO(s)).getroot() 
header = ElementTree.SubElement(tree,'header',{'adminlang': 'EN',}) 
body = ElementTree.SubElement(tree,'body') 
ElementTree.ElementTree(tree).write('myfile.tmx','UTF-8') 

जिसके परिणामस्वरूप जब मैं खोलने: How to create "virtual root" with Python's ElementTree?

यहाँ मेरी कोड है

<?xml version='1.0' encoding='UTF-8'?> 
<tmx version="1.4a"><header adminlang="EN" /><body /></tmx> 

मैं क्या याद आ रही है: 'myfile.tmx' फ़ाइल, यह इस में शामिल है? या, क्या एक बेहतर उपकरण है?

उत्तर

7

आप कर सकते थे lxml और उसके tostring समारोह का उपयोग करें:

from lxml import etree 

s = """<?xml version="1.0" encoding="UTF-8"?> 
<tmx version="1.4a"/>""" 

tree = etree.fromstring(s) 
header = etree.SubElement(tree,'header',{'adminlang': 'EN'}) 
body = etree.SubElement(tree,'body') 

print etree.tostring(tree, encoding="UTF-8", 
        xml_declaration=True, 
        pretty_print=True, 
        doctype='<!DOCTYPE tmx SYSTEM "tmx14a.dtd">') 

=>

<?xml version='1.0' encoding='UTF-8'?> 
<!DOCTYPE tmx SYSTEM "tmx14a.dtd"> 
<tmx version="1.4a"> 
    <header adminlang="EN"/> 
    <body/> 
</tmx> 
8

आप xml_declaration पर write फ़ंक्शन पर गलत सेट कर सकते हैं, इसलिए आउटपुट में एन्कोडिंग के साथ xml घोषणा नहीं होगी, फिर केवल उस शीर्षलेख को जोड़ दें जिसे आपको मैन्युअल रूप से चाहिए। वास्तव में यदि आप के रूप में अपने एन्कोडिंग सेट 'utf-8' (लोअरकेस), XML घोषणा भी नहीं जोड़ा जाएगा:

import xml.etree.cElementTree as ElementTree 

tree = ElementTree.Element('tmx', {'version': '1.4a'}) 
ElementTree.SubElement(tree,'header',{'adminlang': 'EN',}) 
ElementTree.SubElement(tree,'body') 

with open('myfile.tmx', 'w') as f: 
    f.write('<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE tmx SYSTEM "tmx14a.dtd">') 
    ElementTree.ElementTree(tree).write(f, 'utf-8') 

फ़ाइल परिणामस्वरूप (नई-पंक्तियों पठनीयता के लिए जोड़ा):

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE tmx SYSTEM "tmx14a.dtd"> 
<tmx version="1.4a"> 
    <header adminlang="EN" /> 
    <body /> 
</tmx> 
+0

क्या आप समझा सकते हैं कि आपने एक्सएमएल में नई लाइन कैसे जोड़ा? – Learner

+0

@Learner: मैंने इसे पठनीयता के लिए मैन्युअल रूप से जोड़ा। यदि आप ElementTree से नई लाइनों के साथ एक्सएमएल रखना चाहते हैं - एक्सएमएल को सुंदर प्रिंट कैसे करें। – demalexx

0

मुझे या तो वेनिला एलिमेंट ट्री का उपयोग करके इस समस्या का हल नहीं मिला, और demalexx द्वारा प्रस्तावित समाधान गैर-वैध XML बनाया गया जो मेरे आवेदन (डीआईटीए) द्वारा अस्वीकार कर दिया गया था। जो मैं प्रस्तावित करता हूं वह अन्य मॉड्यूल से जुड़े एक कामकाज है और यह मेरे लिए पूरी तरह से काम करता है।

import re 
# found no way for cleanly specify a <!DOCTYPE ...> stanza in ElementTree so 
# so we substitute the current <?xml ... ?> stanza with a full <?xml... + <!DOCTYPE... 
new_header = '<?xml version="1.0" encoding="UTF-8" ?>\n' \ 
       '<!DOCTYPE topic PUBLIC "-//OASIS//DTD DITA Topic//EN" "topic.dtd">\n' 

target_xml = re.sub(u"\<\?xml .+?>", new_header, source_xml) 
with open(filename, 'w') as catalog_file: 
    catalog_file.write(target_xml.encode('utf8')) 
संबंधित मुद्दे