2010-12-17 11 views
11

वर्तमान का उपयोग कर पायथन 2.4.3, औरकैसे जबकि अजगर/ElementTree का उपयोग कर XML पार्सिंग टिप्पणियों रखने के लिए

उन्नत करने के लिए मैं एक या अधिक टैग में दिए गए विशेषता के मूल्यों को बदलना चाहते हैं अनुमति नहीं एक साथ, अद्यतन फ़ाइल में एक्सएमएल-टिप्पणियों के साथ।

मैं Python स्क्रिप्ट है जो तर्क के रूप में एक एक्सएमएल फ़ाइल लेता है, और निर्दिष्ट प्रत्येक टैग के लिए एक विशेषता बदल जाता है, के रूप में नीचे

def update(file, state): 
    global Etree 
    try: 
     from elementtree import ElementTree 
     print '*** using ElementTree' 
    except ImportError, e: 
     print '***' 
     print '*** Error: Must install either ElementTree or lxml.' 
     print '***' 
     raise ImportError, 'must install either ElementTree or lxml' 
    #end try 

    doc = Etree.parse(file) 
    root = doc.getroot() 

    for element in root.findall('.//StateManageable'): 
     element.attrib['initialState'] = state 
    #end for 
    doc.write(file) 
#end def 

यह सब ठीक, गुण "है दिखाया बनाने में कामयाब रहे initialState "अपडेट किया गया है, इस तथ्य को छोड़कर कि मेरे मूल एक्सएमएल में बहुत सी एक्सएमएल टिप्पणियां भी हैं, लेकिन वे लंबे समय से चले गए हैं, जो खराब है।

संदेह है कि पार्स केवल एक्सएमएल-संरचना को पुनर्प्राप्त करता है, लेकिन मैंने एक्सएमएल-टिप्पणियों को सोचा था जहां संरचना का एक हिस्सा था। मुझे यह भी एहसास है कि मेरे मूल दस्तावेज़ का "मानव-पठनीय" स्वरूपण लंबे समय से चला गया है, लेकिन मुझे एहसास हुआ है कि व्यवहार की उम्मीद है, बाद में xmllint --format या एक्सएसएल का उपयोग करके प्रारूपित करने की आवश्यकता है।

+3

2.4? मेरी सहानुभूति। – delnan

+0

आप शर्त लगाते हैं, मेरी पहली स्क्रिप्ट बनाने के लिए मुझे एक कठिन समय था जब मुझे लगता है कि _all_ अच्छी सामग्री जो मैंने पाया है 2.7 :-) – rhellem

उत्तर

16

मुझे पता है कि यह अब पुराना है, लेकिन मैंने टिप्पणी को बनाए रखने के तरीके के ऊपर इस उत्तर में ठोकर खाई। पेड़ में टिप्पणियां कैसे डालने के बारे में फ्रेडरिक की published instructions अभी भी एलिमेंटट्री के मौजूदा संस्करणों के साथ काम करती है, लेकिन कम से कम मेरे उपयोग के लिए इसकी आवश्यकता होती है। यह एक्सएमएल को एक तत्व में लपेटता है, जो मेरे लिए अवांछनीय है। मुझे संरक्षित निर्देशों की आवश्यकता नहीं है, लेकिन केवल टिप्पणियां हैं। जैसे

import xml.etree.ElementTree as ET 

class PCParser(ET.XMLTreeBuilder): 

    def __init__(self): 
     ET.XMLTreeBuilder.__init__(self) 
     # assumes ElementTree 1.2.X 
     self._parser.CommentHandler = self.handle_comment 

    def handle_comment(self, data): 
     self._target.start(ET.Comment, {}) 
     self._target.data(data) 
     self._target.end(ET.Comment) 

इस का उपयोग करने के लिए, एक 'पार्सर' के रूप में इस वस्तु का एक उदाहरण बनाने और उसके बाद ElementTree.parse को पैरामीटर के रूप पारित(): तो, मैं कक्षा वह इस के लिए साइट पर उपलब्ध कराई कांट छांट इस:

parser = PCParser() 
self.tree = ET.parse(self.templateOut, parser=parser) 

मैं कोड के लिए कोई क्रेडिट ले, या ElementTree की गैर-दस्तावेजी उपयोग के लिए है, लेकिन यह मूल दस्तावेज़ संरचना को प्रभावित किए बिना केवल टिप्पणियों के संरक्षण में मेरे लिए काम करता है। और ध्यान दें कि ElementTree में कोई भी भविष्य परिवर्तन (इन सभी वर्षों के बाद इस बिंदु पर असंभव लगता है) हालांकि, इसे तोड़ देगा।

+0

मैं इसके लिए 'lxml' का उपयोग कर रहा हूं और इसे काम करने की कोशिश कर रहा हूं। मैं 'एलएक्सएमएल आयात ईट्री से' के रूप में आयात कर रहा हूं। मुझे लगता है कि मैं 'self'_parser' को' et' के साथ बदल सकता हूं लेकिन यह नहीं समझ सकता कि 'self._target' के बजाय क्या उपयोग करना है। क्या आप मदद कर सकते हैं? – eoinzy

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