আমি সবসময় এক্সএমএলকে প্রক্রিয়া করার জন্য কিছুটা জটিল দেখতে পেয়েছি। আমি এক্সএমএল পার্সার প্রয়োগের কথা বলছি না: আমি একটি স্যাক্স পার্সারের মতো বিদ্যমান স্ট্রিম-ভিত্তিক পার্সার ব্যবহার করার কথা বলছি যা এক্সএমএল নোড দ্বারা প্রসেস করে processes
হ্যাঁ, এই পার্সারগুলির জন্য বিভিন্ন এপিআইগুলি শেখা সত্যিই সহজ, তবে আমি যখনই এক্সএমএল প্রসেস করি এমন কোডটি দেখি তবে আমি সর্বদা এটি কিছুটা বিশৃঙ্খলাযুক্ত বলে মনে করি। অপরিহার্য সমস্যাটি মনে হয় যে কোনও এক্সএমএল ডকুমেন্টটি যৌক্তিকভাবে পৃথক নোডগুলিতে পৃথক করা হয় এবং তবুও ডেটা প্রকার এবং বৈশিষ্ট্যগুলি প্রায়শই আসল তথ্য থেকে আলাদা হয়, কখনও কখনও নীড়ের একাধিক স্তর দ্বারা। সুতরাং, পৃথকভাবে কোনও নির্দিষ্ট নোডের প্রক্রিয়া করার সময়, আমরা কোথায় এবং আমাদের পরবর্তী কী করা দরকার তা নির্ধারণ করতে প্রচুর অতিরিক্ত রাজ্য বজায় রাখা দরকার।
উদাহরণস্বরূপ, একটি সাধারণ এক্সএমএল ডকুমেন্ট থেকে একটি স্নিপেট দেওয়া:
<book>
<title>Blah blah</title>
<author>Blah blah</author>
<price>15 USD</price>
</book>
... আমি যখন বইয়ের শিরোনামযুক্ত পাঠ্য নোডের মুখোমুখি হই তখন কীভাবে নির্ধারণ করব? মনে করুন আমাদের কাছে একটি সাধারণ এক্সএমএল পার্সার রয়েছে যা বারবারের মতো এক্সএমএল ডকুমেন্টে আমাদের পরবর্তী নোড দেয়, এটি একটি পুনরুক্তির মতো কাজ করে 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;
}
}
}
মূলত, এক্সএমএল প্রসেসিং দ্রুত একটি বিশাল, স্টেট-মেশিন চালিত লুপে রূপান্তরিত করে, প্রচুর রাষ্ট্রীয় ভেরিয়েবলগুলি আমরা আগে খুঁজে পেয়েছি প্যারেন্ট নোডগুলি নির্দেশ করতে ব্যবহৃত হয়। অন্যথায়, সমস্ত নেস্টড ট্যাগগুলি ট্র্যাক রাখতে স্ট্যাক অবজেক্টটি বজায় রাখা দরকার। এটি দ্রুত ত্রুটি-প্রবণ এবং বজায় রাখা কঠিন হয়ে পড়ে।
আবার সমস্যাটি মনে হচ্ছে যে আমরা যে ডেটাতে আগ্রহী তা সরাসরি কোনও পৃথক নোডের সাথে সম্পর্কিত নয়। অবশ্যই, এটি হতে পারে, যদি আমরা এক্সএমএল লিখে রাখি:
<book title="Blah blah" author="blah blah" price="15 USD" />
... তবে বাস্তবে এক্সএমএল এর ব্যবহার খুব কমই হয়। বেশিরভাগ ক্ষেত্রে প্যারেন্ট নোডের শিশু হিসাবে আমাদের কাছে পাঠ্য নোড থাকে এবং পাঠ্য নোডটি কী বোঝায় তা নির্ধারণ করার জন্য আমাদের প্যারেন্ট নোডগুলি ট্র্যাক করে রাখতে হবে।
তো ... আমি কি কিছু ভুল করছি? একটি ভাল উপায় আছে কি? কোন মুহুর্তে এক্সএমএল স্ট্রিম-ভিত্তিক পার্সার ব্যবহার করা খুব জটিল হয়ে ওঠে, যাতে একটি পূর্ণ-সজ্জিত ডোম পার্সার প্রয়োজনীয় হয়? আমি অন্যান্য প্রোগ্রামারদের কাছ থেকে শুনতে চাই যে স্ট্রিম-ভিত্তিক পার্সারগুলির সাথে এক্সএমএল প্রক্রিয়াকরণ করার সময় তারা কী ধরণের আইডিয়ম ব্যবহার করে। অবশ্যই স্ট্রিম-ভিত্তিক এক্সএমএল বিশ্লেষণ সর্বদা একটি বিশাল রাজ্য মেশিনে পরিণত হবে?