मुझे एक्सएमएल दस्तावेजों को संभालना है जो काफी बड़े हैं (1 जीबी तक) और उन्हें अजगर के साथ पार्स करें। मैं iterparse() फ़ंक्शन (SAX शैली पार्सिंग) का उपयोग कर रहा हूं।ElementTree iterparse strategy
मेरी चिंता का विषय निम्नलिखित है, कल्पना आप इस
<?xml version="1.0" encoding="UTF-8" ?>
<families>
<family>
<name>Simpson</name>
<members>
<name>Homer</name>
<name>Marge</name>
<name>Bart</name>
</members>
</family>
<family>
<name>Griffin</name>
<members>
<name>Peter</name>
<name>Brian</name>
<name>Meg</name>
</members>
</family>
</families>
समस्या निश्चित रूप से, है की तरह एक xml है पता करने के लिए जब मैं एक परिवार के नाम हो रही है (द सिम्पसंस के रूप में) और जब मैं नाम हो रही है उस परिवार के सदस्य (उदाहरण के लिए होमर) में से एक
जो मैं अब तक कर रहा हूं वह "स्विच" का उपयोग करना है जो मुझे बताएगा कि मैं "सदस्यों" टैग के अंदर हूं या नहीं, कोड इस तरह दिखेगा
import xml.etree.cElementTree as ET
__author__ = 'moriano'
file_path = "test.xml"
context = ET.iterparse(file_path, events=("start", "end"))
# turn it into an iterator
context = iter(context)
on_members_tag = False
for event, elem in context:
tag = elem.tag
value = elem.text
if value :
value = value.encode('utf-8').strip()
if event == 'start' :
if tag == "members" :
on_members_tag = True
elif tag == 'name' :
if on_members_tag :
print "The member of the family is %s" % value
else :
print "The family is %s " % value
if event == 'end' and tag =='members' :
on_members_tag = False
elem.clear()
और यह ठीक काम करता है के रूप में उत्पादन
The family is Simpson
The member of the family is Homer
The member of the family is Marge
The member of the family is Bart
The family is Griffin
The member of the family is Peter
The member of the family is Brian
The member of the family is Meg
मेरी चिंता का विषय है कि इस (सरल) उदाहरण के साथ मैं एक अतिरिक्त चर पता करने के लिए जो टैग में मैं था (on_members_tag) सच एक्सएमएल उदाहरण के साथ कल्पना बनाने के लिए किया था है कि मुझे संभालना है, उनके पास अधिक घोंसला वाले टैग हैं।
यह भी ध्यान रखें कि यह एक बहुत ही कम उदाहरण है, इसलिए आप मान सकते हैं कि मुझे अधिक टैग, अधिक आंतरिक टैग और विभिन्न टैग नाम, विशेषताओं आदि के साथ एक एक्सएमएल का सामना करना पड़ सकता है।
तो सवाल है। क्या मैं यहाँ कुछ बेवकूफ बेवकूफ कर रहा हूँ? मुझे लगता है कि इसके लिए एक और अधिक सुरुचिपूर्ण समाधान होना चाहिए।
आप डेटा के साथ क्या करेंगे? इसे सभी को पकड़ने के लिए पाइथन डेटा संरचना का निर्माण करें, या पुनरावृत्ति करते समय डीबी में स्टोर करें, या कुछ और? –
@JanneKarila: डेटा को पायथन संरचना पर रखा जा सकता है, डीबी या डंप को फ़ाइल में सहेज सकता है, यह प्रोसेस पर निर्भर करेगा, इस मामले में आप मान सकते हैं कि यह डीबी –