मैंने हमेशा XML को प्रक्रिया के लिए कुछ बोझिल पाया है। मैं XML पार्सर को लागू करने के बारे में बात नहीं कर रहा हूं: मैं एक मौजूदा स्ट्रीम-आधारित पार्सर का उपयोग करने के बारे में बात कर रहा हूं , जैसे कि एसएएक्स पार्सर, जो नोड द्वारा XML नोड को संसाधित करता है।
हां, इन पार्सर्स के लिए विभिन्न एपीआई सीखना वास्तव में आसान है, लेकिन जब भी मैं एक्सएमएल को संसाधित करने वाले कोड को देखता हूं तो मुझे हमेशा यह लगता है कि यह कुछ हद तक जटिल है। आवश्यक समस्या यह प्रतीत होती है कि XML दस्तावेज़ को तार्किक रूप से अलग-अलग नोड्स में अलग किया जाता है, और फिर भी डेटा प्रकार और विशेषताओं को अक्सर वास्तविक डेटा से अलग किया जाता है, कभी-कभी कई स्तरों के घोंसले के शिकार द्वारा। इसलिए, जब किसी विशेष नोड को व्यक्तिगत रूप से संसाधित किया जाता है, तो यह निर्धारित करने के लिए कि हम कहां हैं और हमें आगे क्या करना है, यह निर्धारित करने के लिए बहुत अधिक अतिरिक्त स्थिति बनाए रखने की आवश्यकता है।
उदाहरण के लिए, किसी विशिष्ट XML दस्तावेज़ से एक स्निपेट दिया गया:
<book>
<title>Blah blah</title>
<author>Blah blah</author>
<price>15 USD</price>
</book>
... मैं कैसे निर्धारित करूँगा जब मैंने एक पुस्तक शीर्षक वाले पाठ नोड का सामना किया है? मान लें कि हमारे पास एक सरल XML पार्सर है जो एक पुनरावृत्त की तरह कार्य करता है, हमें XML दस्तावेज़ में अगले नोड देता है जिसे हम कॉल करते हैं XMLParser.getNextNode()
। मैं अनिवार्य रूप से अपने आप को निम्नलिखित की तरह कोड लिख रहा हूँ:
boolean insideBookNode = false;
boolean insideTitleNode = false;
while (!XMLParser.finished())
{
....
XMLNode n = XMLParser.getNextNode();
if (n.type() == XMLTextNode)
{
if (insideBookNode && insideTitleNode)
{
// We have a book title, so do something with it
}
}
else
{
if (n.type() == XMLStartTag)
{
if (n.name().equals("book")) insideBookNode = true
else if (n.name().equals("title")) insideTitleNode = true;
}
else if (n.type() == XMLEndTag)
{
if (n.name().equals("book")) insideBookNode = false;
else if (n.name().equals("title")) insideTitleNode = false;
}
}
}
मूल रूप से, XML प्रसंस्करण जल्दी से एक विशाल, राज्य-मशीन चालित लूप में बदल जाता है, जिसमें बहुत से राज्य चर पहले देखे गए मूल नोड्स को इंगित करने के लिए उपयोग किए जाते हैं। अन्यथा, सभी नेस्टेड टैग का ट्रैक रखने के लिए एक स्टैक ऑब्जेक्ट को बनाए रखने की आवश्यकता होती है। यह जल्दी से त्रुटि-ग्रस्त हो जाता है और इसे बनाए रखना मुश्किल होता है।
फिर, समस्या यह प्रतीत होती है कि जिस डेटा में हम रुचि रखते हैं वह सीधे एक व्यक्तिगत नोड से जुड़ा नहीं है। यकीन है, यह हो सकता है, अगर हम XML की तरह लिखा है:
<book title="Blah blah" author="blah blah" price="15 USD" />
... लेकिन यह शायद ही कभी होता है कि वास्तविकता में XML का उपयोग कैसे किया जाता है। अधिकतर हमारे पास मूल नोड्स के बच्चों के रूप में टेक्स्ट नोड्स होते हैं, और यह निर्धारित करने के लिए कि हमें टेक्स्ट नोड का क्या मतलब है, पेरेंट नोड्स का ट्रैक रखने की आवश्यकता है।
तो ... क्या मैं कुछ गलत कर रहा हूं? क्या कोई बेहतर तरीका है? किस बिंदु पर XML स्ट्रीम-आधारित पार्सर का उपयोग करना बहुत बोझिल हो जाता है, जिससे कि पूरी तरह से विकसित डोम पार्सर आवश्यक हो जाता है? मैं अन्य प्रोग्रामर्स से सुनना चाहता हूं कि स्ट्रीम-आधारित पार्सर्स के साथ XML को संसाधित करते समय वे किस प्रकार के मुहावरों का उपयोग करते हैं। धारा-आधारित XML पार्सिंग हमेशा एक विशाल राज्य मशीन में बदल जाता है?