2012-09-17 6 views
9

जब पायथन के etree साथ एक XML फ़ाइल बनाने, अगर हम फाइल करने के लिए SubElement का उपयोग कर एक खाली टैग लिखते हैं, मैं:अजगर etree नियंत्रण खाली टैग प्रारूप

<MyTag /> 

दुर्भाग्य से, हमारी XML पार्सर फोरट्रान में इस्तेमाल किया पुस्तकालय नहीं करता है यह एक सही टैग होने के बावजूद इसे संभाल नहीं है। इसे देखने की जरूरत है:

<MyTag></MyTag> 

क्या इस काम को बनाने के लिए स्वरूपण नियमों या कुछ में बदलाव करने का कोई तरीका है? ,

>>> from xml.etree import ElementTree as ET 
>>> ET.tostring(ET.fromstring('<mytag/>'), method='html') 
'<mytag></mytag>' 

दोनों write() method और tostring() functionmethod कीवर्ड तर्क का समर्थन बशर्ते आप अजगर 2.7 या ऊपर का उपयोग करें:

उत्तर

10

उपयोग html विधि दस्तावेज़ को लिखने के लिए।

पायथन के पिछले संस्करणों पर, आप बाहरी ElementTree लाइब्रेरी इंस्टॉल कर सकते हैं; संस्करण 1.3 उस कीवर्ड का समर्थन करता है।

हां, यह थोड़ा अजीब लगता है, लेकिन html आउटपुट ज्यादातर प्रारंभ तत्वों को प्रारंभ और अंत टैग के रूप में आउटपुट करता है। कुछ तत्व अभी भी खाली टैग तत्वों के रूप में समाप्त होते हैं; विशेष रूप से <link/>, <input/>, <br/> और ऐसे। फिर भी, यह आपके फोरट्रान एक्सएमएल पार्सर को वास्तव में मानक-अनुरूप एक्सएमएल का विश्लेषण करने के लिए अपग्रेड या अपग्रेड करता है!

+0

दुर्भाग्यवश, उपयोग करने के लिए कोई अन्य फोरट्रान एक्सएमएल पार्सर नहीं है, इसलिए यह हमारा एकमात्र विकल्प है। धन्यवाद! – tpg2114

+0

टैग के मामले को बनाए रखने का कोई तरीका है? स्पष्ट रूप से केस संवेदनशीलता एक मुद्दा भी है और 'html' केस को संरक्षित नहीं करता है ... – tpg2114

+0

@ tpg2114: नहीं, क्षमा करें। –

0

आप उपलब्ध sed है, तो आप पाइप सकता है <Tag /> के किसी भी घटना खोजने के लिए और से <Tag></Tag>

2

एक खाली text जोड़ने का स्थान ले लेगा

sed -e "s/<\([^>]*\) \/>/<\1><\/\1>/g" 

करने के लिए अपने अजगर स्क्रिप्ट का आउटपुट एक और विकल्प है :

etree.SubElement(parent, 'child_tag_name').text='' 

लेकिन ध्यान दें कि यह न केवल प्रतिनिधित्व को बदल देगा बल्कि struc दस्तावेज़ का ट्रेस: ​​i.e. child_el.text के बजाय '' होगा।

ओह, और मार्टिजन की तरह, बेहतर पुस्तकालयों का उपयोग करने का प्रयास करें।

0

कोड Paraphrasing, मैं का उपयोग ElementTree.py के संस्करण एक _write विधि में निम्नलिखित शामिल हैं:

class AlwaysTrueString(str): 
    def __nonzero__(self): return True 
true_empty_string = AlwaysTrueString() 

तब मैं node.text = true_empty_string सेट:

write('<' + tagname) 
... 
if node.text or len(node): # this line is literal 
    write('>') 
    ... 
    write('</%s>' % tagname) 
else: 
    write(' />') 

कार्यक्रम काउंटर चलाने के लिए मैं निम्नलिखित बनाया उन ElementTree नोड्स पर जहां मैं स्वयं को बंद करने के बजाए एक खुले-बंद टैग चाहता हूं।

"प्रोग्राम काउंटर स्टीयरिंग" से मेरा मतलब है इनपुट के एक सेट का निर्माण करना- इस मामले में एक लाइब्रेरी विधि के लिए कुछ हद तक जिज्ञासा सत्य परीक्षण के साथ एक वस्तु है, जैसे लाइब्रेरी विधि का आविष्कार इसके नियंत्रण प्रवाह ग्राफ को रास्ते में घुमाता है मैं इसे चाहता हूँ यह हास्यास्पद रूप से भंगुर है: लाइब्रेरी के एक नए संस्करण में, मेरा हैक टूट सकता है-और आपको शायद "शायद" को "लगभग गारंटी" के रूप में व्यवहार करना चाहिए। सामान्य रूप से, अमूर्त बाधाओं को तोड़ना नहीं है। यह सिर्फ मेरे लिए यहाँ काम किया।

3

यह सीधे पायथन 3.4 में हल किया गया था।

तत्वों है कि कोई सामग्री दर्शाने वाले स्वरूपण को नियंत्रित करता है: तब से, xml.etree.ElementTree.ElementTree की write विधि short_empty_elements पैरामीटर जो है। यदि सही (डिफ़ॉल्ट) है, तो वे एक एकल स्व-बंद टैग के रूप में उत्सर्जित होते हैं, अन्यथा वे प्रारंभ/समाप्ति टैग की एक जोड़ी के रूप में उत्सर्जित होते हैं।

xml.etree documentation में अधिक जानकारी।

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