2013-01-10 11 views
5

मैं जेनेरिक एक्सएमएल फाइलों को मानकीकृत करने के लिए एक पायथन लिपि लिखने की कोशिश कर रहा हूं, जो वेबसाइटों और वेबसाइट फॉर्मों को कॉन्फ़िगर करने के लिए उपयोग किया जाता है। हालांकि ऐसा करने के लिए मैं या तो तत्वों के मूल विशेषता क्रम को बनाए रखना चाहता हूं, या इससे पहले कि उन्हें पूर्व परिभाषित तरीके से पुनर्व्यवस्थित करने में सक्षम हो। वर्तमान में अधिकांश एक्सएमएल पार्सर्स मैंने अल्फा-न्यूमेरिक होने के लिए विशेषता ऑर्डर को फिर से लिखने का प्रयास किया है। चूंकि ये एक्सएमएल फाइलें मानव पढ़ी/लिखी और रखी जाती हैं, यह बहुत उपयोगी नहीं है।एलिमेंट्री सेटिंग विशेषता ऑर्डर

उदाहरण के लिए एक्सएमएल में एक सामान्य तत्व ऐसा दिखाई दे सकता है;

<Question QuestionRef="XXXXX" DataType="Integer" Text="Question Text" Availability="Shown" DefaultAnswer="X"> 

हालांकि एक बार ElementTree और फिर से लिखा एक नई फ़ाइल में के माध्यम से पारित इस के लिए बदल गया है: क्रम में एक्सएमएल फाइल की एक बड़ी संख्या के मानकीकरण के लिए स्क्रिप्ट का उद्देश्य के रूप में

<Question Availability="Shown" DataType="Integer" DefaultAnswer="X" PartType="X" QuestionRef="XXXXX" Text="Question Text"> 

है करने के लिए सहकर्मियों के बीच पठनीयता में वृद्धि और तत्व के गुणों में निहित जानकारी में महत्व के विभिन्न स्तर होते हैं (उदा। प्रश्नोत्तर अत्यंत महत्वपूर्ण है), यह बताता है कि विशेषताओं को समझदारी से आदेश दिया जाना चाहिए।

मैं समझता हूं कि पाइथन डिक्ट्स (जो गुणों को संग्रहीत किया जाता है) स्वाभाविक रूप से अनियंत्रित हैं और एक्सएमएल विनिर्देशन राज्य विशेषता ऑर्डरिंग महत्वहीन है, लेकिन यह मानव पठनीयता कारक स्क्रिप्ट के पीछे चालक शक्ति है।

अन्य प्रश्नों में (स्टैक ओवरफ़्लो पर) इस तरह के समान मैंने देखा है कि pxdom ऐसा कर सकता है (प्रश्न लिंक: link), लेकिन मुझे यह नहीं पता कि यह pxdom दस्तावेज़ में ऐसा कैसे कर सकता है या एक Google खोज का उपयोग कर। तो क्या गुणों का क्रम बनाए रखने या वर्तमान एक्सएमएल पार्सर्स के साथ इसे परिभाषित करने का कोई तरीका है? पसंदीदा रूप से हॉटपैचिंग का उपयोग किए बिना :)!

कोई भी सहायता जो भी प्रदान कर सकता है उसकी सराहना की जाएगी :)।

+2

मेरा पहला यद्यपि यह है कि शायद आपको मानव संपादन के लिए एक अलग फ़ाइल प्रारूप (जैसे yaml?) का उपयोग करना चाहिए - और फिर सिस्टम द्वारा आवश्यक होने पर एक्सएमएल में अनुवाद करना चाहिए ... –

+0

यदि गुणों का क्रम महत्वपूर्ण है, तो क्या आपने उप तत्वों का उपयोग करने पर विचार किया है (उदाहरण: '<उपलब्धता> दिखाया गया') इसके बजाय? वहां, आदेश निश्चित रूप से संरक्षित है। – Constantinius

+0

समस्या है कि एक्सएमएल सी # कोड को पास किया गया है जो एचटीएमएल और जावास्क्रिप्ट में वेबसाइटें उत्पन्न करता है। यह कोड लगभग 5 वर्षों में विकसित किया गया है, बल्कि भारी है। इसलिए एक्सएमएल से स्विचिंग असुरक्षित है क्योंकि उपलब्धता को उप-तत्व में ले जाया जा रहा है। हालांकि मदद के लिए धन्यवाद :) –

उत्तर

5

बंदर पैच लागू करें नीचे के रूप में ::
ElementTree.py फ़ाइल में उल्लेख किया है, वहाँ _serialize_xml के रूप में नामित एक समारोह है; इस समारोह में
; नीचे उल्लिखित पैच लागू करें;

 ##for k, v in sorted(items): # remove the sorted here 
     for k, v in items: 
      if isinstance(k, QName): 
       k = k.text 
      if isinstance(v, QName): 
       v = qnames[v.text] 
      else: 
       v = _escape_attrib(v, encoding) 
      write(" %s=\"%s\"" % (qnames[k], v)) 

यहां; sorted(items) हटाएं और इसे केवल items बनाएं जैसा मैंने ऊपर किया है।

नामस्थान के आधार पर सॉर्टिंग को अक्षम करने के लिए (क्योंकि उपरोक्त पैच में; सॉर्टिंग अभी भी मौजूद है जब नामस्थान xml विशेषता के लिए मौजूद है, अन्यथा यदि नामस्थान मौजूद नहीं है, तो ऊपर ठीक काम कर रहा है); ताकि ऐसा करने के लिए, से ElementTree.py

अब आप के रूप में आप उन्हें उस xml तत्व में शामिल किया है एक आदेश में सभी गुण collections.OrderedDict() के साथ सभी {} बदलें।

उपर्युक्त सभी करने से पहले; ElementTree.py

+0

धन्यवाद, मैं इसे जाने दूंगा :) –

+0

तो, क्या यह काम करता है? – meowsqueak

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