স্যাক্স এবং ডোমের মধ্যে পার্থক্য কী?


242

আমি এক্সএমএল পার্সার সম্পর্কিত কিছু নিবন্ধ পড়েছি এবং স্যাক্স এবং ডম জুড়ে এসেছি ।

SAX ইভেন্ট ভিত্তিক এবং DOM গাছের মডেল - আমি এই ধারণার মধ্যে পার্থক্য বুঝতে পারি না।

আমি যা বুঝতে পেরেছি তা থেকে ইভেন্ট-ভিত্তিক মানে নোডের সাথে এক ধরণের ঘটনা ঘটে। একটি নির্দিষ্ট নোড ক্লিক করার সময় এটি একই সাথে সমস্ত নোড লোড করার পরিবর্তে সমস্ত সাব নোড দেয়। তবে ডিওএম পার্স করার ক্ষেত্রে এটি সমস্ত নোড লোড করবে এবং গাছের মডেল তৈরি করবে।

আমার বোধগম্যতা কি সঠিক?

দয়া করে আমাকে সংশোধন করুন যদি আমি ভুল হয়ে থাকি বা ইভেন্ট-ভিত্তিক এবং ট্রি মডেলকে আরও সহজ পদ্ধতিতে ব্যাখ্যা করি।


সঠিকভাবে কোনও ডিওএম কথা বলা পার্সার নয়। প্রদত্ত যে কোনও ডিওএম-ভিত্তিক সফ্টওয়্যার মার্কআপ পার্সিং অন্তর্ভুক্ত করতে পারে বা নাও পারে এবং বেশিরভাগ এইচটিএমএল ডিওএম সফ্টওয়্যার করে। তবে একটি ডিওএম একটি সম্পূর্ণ পৃথক জিনিস যা কোনও সিরিয়ালাইজেশনের বিন্যাসের সাথে যুক্ত নাও হতে পারে।
বব 77

উত্তর:


305

ভাল, আপনি কাছাকাছি।

SAX এ, এক্সএমএল বিশ্লেষণ করার সময় ইভেন্টগুলি ট্রিগার করা হয় । যখন পার্সার এক্সএমএল বিশ্লেষণ করছে এবং একটি ট্যাগের (যেমন <something>) শুরু হয় , তখন এটি tagStartedইভেন্টটি ট্রিগার করে (ইভেন্টের আসল নামটি পৃথক হতে পারে)। একইভাবে যখন ( </something>) পার্স করার সময় ট্যাগটির সমাপ্তি হয় , তখন এটি ট্রিগার হয় tagEnded। একটি স্যাক্স পার্সার ব্যবহার করে বোঝায় যে আপনাকে এই ইভেন্টগুলি পরিচালনা করতে হবে এবং প্রতিটি ইভেন্টের সাথে ফিরে আসা ডেটাটি বোঝার প্রয়োজন।

ডিওমে, বিশ্লেষণের সময় কোনও ইভেন্টই ট্রিগার হয়নি। পুরো এক্সএমএল বিশ্লেষণ করা হয়েছে এবং একটি ডোম ট্রি (এক্সএমএলে নোডগুলির) উত্পন্ন এবং ফিরে আসবে। একবার পার্স করা হয়ে গেলে ব্যবহারকারী এক্সএমএলে বিভিন্ন নোডে এমবেড করা বিভিন্ন ডেটা অ্যাক্সেস করতে গাছটি নেভিগেট করতে পারে।

সাধারণভাবে, ডিওএম ব্যবহার করা সহজ তবে আপনি এটি ব্যবহার শুরু করার আগে পুরো এক্সএমএলটিকে পার্স করার ওভারহেড রয়েছে।


135
+1 - স্পষ্ট করার জন্য: র‌্যামের সাথে মানানসই ছোট ফাইলগুলির সাথে একটি ডিওএম পার্সার ব্যবহার করুন। অভ্যাস না হওয়া বড় ফাইলগুলির জন্য একটি SAX পার্সার ব্যবহার করুন।
রিচার্ড এইচ

ধন্যবাদ @ স্পার্টকিমেট তবে স্যাক্স ইভেন্ট ভিত্তিক স্যাক্স পার্সার কি নির্দিষ্ট শিশু নোড নির্দিষ্ট পিতা-মাতার সন্তানের পক্ষে জানতে সক্ষম হবে? নাকি কেবল পার্স করবে? উদাহরণ স্বরূপ. আমার একটি <কম্পানি> এবং সন্তানের নাম <ক্যাম্পলয়ে>। সুতরাং এই ক্ষেত্রে সেই সংস্থাগুলি এবং কর্মচারী কেবল বিশ্লেষণ করা হবে বা এটি সংস্থাটির কর্মচারীর পিতামাতার সম্পর্কটি প্রদর্শন করবে?
ব্যবহারকারী414967

4
এটি কেবল বিশ্লেষণ করবে। আপনাকে এই জাতীয় তথ্য নিজেই বজায় রাখতে হবে (স্টেট মেশিনের মাধ্যমে বা অন্যথায়)। একটি ডিওএম পার্সার ব্যবহার করার আরও আরও কারণ (যদি সংস্থাগুলি অনুমতি দেয়) :-)।
স্পার্কায়াম্যাট

1
@ রিচার্ড এইচ আমি যুক্তি দিয়েছি যে যে কেউ এক্সএমএল ফাইলগুলি এত বিশাল ব্যবহার করে যে তারা র‍্যামের সাথে খাপ খায় না সে খুব খারাপ কিছু করছে।
antred

1
40 মি মাপের একটি এক্সেল লোড করুন, স্যাক্স পার্সার ব্যবহার করার সময় 200 মি মেমরি ব্যবহার করুন, তবে ডওম পার্সার ব্যবহার করার সময় 9 জি মেমরি ব্যবহার করুন।
zhiyuan_

98

মাত্র কয়েকটি কথায় ...

SAX ( এস imple একটি জন্য Pi এক্স এম এল): একটি স্ট্রিম-ভিত্তিক প্রসেসর। আপনার যে কোনও সময়ে স্মৃতিতে কেবলমাত্র একটি ক্ষুদ্র অংশ রয়েছে এবং আপনি যেমন এক্সএমএল স্ট্রিমকে কলব্যাক কোড প্রয়োগ করে tagStarted()ইত্যাদি জাতীয় ইভেন্টের জন্য "স্নিগ্ধ" করেন এটি প্রায় কোনও স্মৃতি ব্যবহার করে না, তবে আপনি "ডোম" স্টাফ ব্যবহার করতে পারবেন না, যেমন এক্সপথ বা ট্র্যাভার্স ব্যবহার করুন গাছ।

ডোম ( ডি ocament O bject M odel): আপনি পুরো জিনিসটিকে মেমরিতে লোড করেন - এটি একটি বিশাল মেমরি হোগ। আপনি এমনকি মাঝারি আকারের নথি দিয়ে মেমরি উড়িয়ে দিতে পারেন। তবে আপনি এক্সপথ ব্যবহার করতে পারেন এবং গাছটি ট্র্যাভার করতে পারেন etc.


66

এখানে সহজ কথায়:

করে DOM

  • ট্রি মডেল পার্সার (অবজেক্ট ভিত্তিক) (নোডের গাছ)।

  • ডোম ফাইলটিকে মেমোরিতে লোড করে এবং তারপরে ফাইলটি বিশ্লেষণ করে।

  • পার্সিংয়ের আগে এটি পুরো এক্সএমএল ফাইলটি লোড করার কারণে স্মৃতিতে বাধা রয়েছে।

  • ডিওএম পড়তে এবং লিখতে হয় (নোডগুলি সন্নিবেশ বা মুছতে পারে)

  • যদি এক্সএমএল সামগ্রীটি ছোট হয় তবে ডিওএম পার্সারটিকে পছন্দ করুন।

  • ট্যাগগুলির ভিতরে থাকা তথ্যের জন্য ট্যাগগুলি অনুসন্ধান এবং মূল্যায়নের জন্য পিছিয়ে এবং এগিয়ে অনুসন্ধান সম্ভব search সুতরাং এটি নেভিগেশন আরাম দেয়।

  • রান সময় ধীর।

SAX

  • ইভেন্ট ভিত্তিক পার্সার (ইভেন্টের ক্রম)।

  • SAX ফাইল পড়ার সাথে সাথে পার্স করে, অর্থাত নোডকে নোডকে পার্স করে।

  • কোনও স্মৃতিতে বাধা নেই কারণ এটি মেমরিতে XML সামগ্রী সংরক্ষণ করে না।

  • স্যাক্স কেবল পঠিত অর্থাৎ নোড sertোকাতে বা মুছতে পারে না।

  • মেমরির সামগ্রী বড় হলে SAX পার্সার ব্যবহার করুন।

  • SAX এক্সএমএল ফাইলটি উপরে থেকে নীচে পর্যন্ত পড়ে এবং পিছনের নেভিগেশন সম্ভব নয়।

  • রান সময় দ্রুত।


নিখুঁত ... পয়েন্টে কিছু উত্তর আশা ছিল। ভাল কাজ :)
কুণাল গুপ্ত

37

আপনি ডম ভিত্তিক মডেলটি বোঝার ক্ষেত্রে সঠিক। এক্সএমএল ফাইলটি সামগ্রিকভাবে লোড হবে এবং এর সমস্ত বিষয়বস্তু ডকুমেন্টটি প্রতিনিধিত্ব করে এমন গাছের একটি মেমোরি উপস্থাপনা হিসাবে নির্মিত হবে। ইনপুট ফাইলটি কত বড় তার উপর নির্ভর করে এটি সময় এবং মেমরি গ্রহণযোগ্য হতে পারে। এই পদ্ধতির সুবিধা হ'ল আপনি নথির যে কোনও অংশ সহজেই জিজ্ঞাসা করতে পারেন এবং গাছের সমস্ত নোডকে অবাধে ম্যানিপুলেট করতে পারেন।

DOM পদ্ধতির সাধারণত ছোট এক্সএমএল স্ট্রাকচারের জন্য ব্যবহৃত হয় (যেখানে আপনার প্ল্যাটফর্মটি কতটা হর্সপাওয়ার এবং মেমরির উপর নির্ভর করে ছোট) যেগুলি লোড হয়ে যাওয়ার পরে বিভিন্ন উপায়ে পরিবর্তন ও অনুসন্ধান করা প্রয়োজন হতে পারে।

অন্যদিকে SAX কার্যত কোনও আকারের এক্সএমএল ইনপুট হ্যান্ডেল করার জন্য ডিজাইন করা হয়েছে। ডকুমেন্টের কাঠামোটি নির্ণয় এবং সমস্ত নোড, বৈশিষ্ট্য ইত্যাদির জন্য প্রচুর পরিমাণে অবজেক্ট প্রস্তুত করার জন্য এক্সএমএল কাঠামোটি আপনার পক্ষে কঠোর পরিশ্রমের পরিবর্তে স্যাক্স সম্পূর্ণরূপে এটি আপনাকে ছেড়ে দেয়।

এটি মূলত যা করে তা হ'ল উপরের ইনপুটটি পড়ুন এবং যখন কিছু "ইভেন্ট" ঘটে থাকে তখন আপনি সরবরাহিত কলব্যাক পদ্ধতিগুলি উপস্থাপন করেন। কোনও ইভেন্ট কোনও খোলার ট্যাগ, ট্যাগের একটি বৈশিষ্ট্য, কোনও উপাদানটির ভিতরে পাঠ্য সন্ধান করা বা একটি শেষ ট্যাগ জুড়ে আসতে পারে।

SAX একগুঁয়েভাবে ইনপুটটি পড়ে এবং আপনাকে জানায় যে এটি এই ফ্যাশনে কী দেখে। আপনার প্রয়োজনীয় সমস্ত রাজ্য-তথ্য বজায় রাখা আপনার উপর নির্ভর করে। সাধারণত এর অর্থ আপনি কোনও প্রকারের রাষ্ট্র-মেশিন তৈরি করবেন।

যদিও এক্সএমএল প্রসেসিংয়ের এই পদ্ধতিটি অনেক বেশি ক্লান্তিকর, এটি খুব শক্তিশালীও হতে পারে। কল্পনা করুন আপনি কেবল একটি ব্লগ ফিড থেকে সংবাদ নিবন্ধের শিরোনামগুলি বের করতে চান। আপনি যদি এক্সটিএমএলটি ডিওএম ব্যবহার করে পড়ে থাকেন তবে এটি এক্সএমএলে থাকা সমস্ত নিবন্ধগুলি, সমস্ত চিত্র ইত্যাদি লোড করবে মেমরিতে, এমনকি আপনি এতে আগ্রহী না হলেও।

SAX এর সাহায্যে আপনি যখনই "স্টার্টট্যাগ" ইভেন্ট পদ্ধতিটি কল করা হয় তখনই উপাদানটির নাম (যেমন) "শিরোনাম" কিনা তা খতিয়ে দেখতে পারেন। যদি তা হয় তবে আপনি জানেন যে পরবর্তী "এলিমেন্টেক্সট" ইভেন্ট আপনাকে যা দেবে তা যুক্ত করতে হবে। আপনি যখন "এন্ডট্যাগ" ইভেন্ট কলটি পাবেন, আপনি আবার পরীক্ষা করে দেখুন এটি "শিরোনাম" এর সমাপ্ত উপাদান if এরপরে, আপনি ইনপুট শেষ না হওয়া অবধি, বা "শিরোনাম" এর নামের সাথে অন্য একটি "স্টার্টট্যাগ" না আসা পর্যন্ত আপনি কেবলমাত্র সমস্ত উপাদান উপেক্ষা করবেন। এবং আরও ...

আপনি এক্সএমএল এর মেগাবাইট এবং মেগাবাইটের মাধ্যমে এইভাবে পড়তে পারতেন, কেবলমাত্র আপনার প্রয়োজনীয় পরিমাণের পরিমাণের পরিমাণ বের করতে পারেন।

এই পদ্ধতির নেতিবাচক দিকটি অবশ্যই, আপনাকে কী ডেটা উত্তোলন করতে হবে এবং এক্সএমএল কাঠামোটি কতটা জটিল, তার উপর নির্ভর করে নিজেকে আরও অনেক বেশি বইয়ে রাখার দরকার রয়েছে। তদতিরিক্ত, আপনি স্বাভাবিকভাবেই এক্সএমএল গাছের কাঠামোটি সংশোধন করতে পারবেন না, কারণ আপনার কাছে এটি সামগ্রিকভাবে কখনও হাতে নেই।

সুতরাং সাধারণভাবে, স্যাক্স একটি নির্দিষ্ট "ক্যোয়ারী" মাথায় রেখে আপনি প্রাপ্ত সম্ভাব্য পরিমাণে প্রচুর পরিমাণে ডেটা কম্বাইয়ের জন্য উপযুক্ত, তবে পরিবর্তনের দরকার নেই, তবে ডিওএম আপনাকে ব্যয় করে কাঠামো এবং বিষয়বস্তু পরিবর্তনে সম্পূর্ণ নমনীয়তা দেওয়ার দিকে লক্ষ্য রাখে while উচ্চ সংস্থান চাহিদা।


16

আপনি আপেল এবং নাশপাতি তুলনা করছেন। SAX একটি পার্সার যা সিরিয়ালযুক্ত DOM কাঠামোকে বিশ্লেষণ করে। এখানে অনেকগুলি পার্সার রয়েছে এবং "ইভেন্ট-ভিত্তিক" পার্সিং পদ্ধতিটিকে বোঝায়।

একটি ছোট পুনরুদ্ধার ক্রমযুক্ত:

  • ডকুমেন্ট অবজেক্ট মডেল (করে DOM) একটি বিমূর্ত তথ্য মডেল যে একটি হায়ারারকিকাল বৃক্ষ-ভিত্তিক ডকুমেন্ট গঠন বর্ণনা করে; একটি দস্তাবেজ গাছের মধ্যে নোড থাকে , যেমন উপাদান, বৈশিষ্ট্য এবং পাঠ্য নোড (এবং কিছু অন্যান্য)। নোডের বাবা-মা, ভাই-বোন এবং বাচ্চারা রয়েছে এবং ট্র্যাভারস করা যেতে পারে, ইত্যাদি, জাভাস্ক্রিপ্ট করা থেকে আপনার ব্যবহৃত সমস্ত জিনিস (যা ঘটনাক্রমে ডোমের সাথে কোনও সম্পর্ক নেই)।

  • একটি ডিওএম কাঠামো সিরিয়ালযুক্ত হতে পারে , যেমন এইচটিএমএল বা এক্সএমএল এর মতো একটি মার্কআপ ভাষা ব্যবহার করে কোনও ফাইলের কাছে লেখা। এইচটিএমএল বা এক্সএমএল ফাইলটিতে একটি বিমূর্ত নথির গাছের "লিখিত আউট" বা "সমতল" সংস্করণ থাকে।

  • একটি ফাইল থেকে একটি ডিওএম ট্রি কম্পিউটারের ম্যানিপুলেট, বা এমনকি প্রদর্শনের জন্য, ফাইলটি ডিসায়ারাইজ করতে বা পার্স করতে হয় এবং মেমরিতে অ্যাবস্ট্রাক্ট ট্রিটিকে পুনর্গঠন করতে হয়। এখানেই পার্সিং আসে।

এখন আমরা পার্সার প্রকৃতিতে আসি। বিশ্লেষণের একটি উপায় হ'ল পুরো নথিতে পড়ুন এবং স্মৃতিতে পুনরাবৃত্তভাবে একটি গাছের কাঠামো তৈরি করা এবং অবশেষে পুরো ফলাফলটি ব্যবহারকারীর সামনে প্রকাশ করা। (আমি মনে করি আপনি এই পার্সারগুলিকে "ডোম পার্সারস" বলতে পারেন)) এটি ব্যবহারকারীর পক্ষে খুব সহজ হবে (আমি মনে করি পিএইচপি-র এক্সএমএল পার্সার এটিই করে) তবে এটি স্কেলেবিলিটি সমস্যায় ভুগছে এবং বড় ডকুমেন্টগুলির জন্য খুব ব্যয়বহুল হয়ে যায়।

অন্যদিকে, ইভেন্ট-ভিত্তিক বিশ্লেষণ, SAX দ্বারা করা হিসাবে, ফাইলটি রৈখিকভাবে দেখায় এবং যখনই "কাঠামোর এই উপাদানটি শুরু হয়", "যে উপাদানটির সমাপ্তি ঘটে" এর মতো ডেটার কাঠামোগত অংশের মুখোমুখি হয় তখনই ব্যবহারকারীকে কল-ব্যাক করে makes , "এখানে কিছু পাঠ্য" ইত্যাদি This এতে সুবিধা রয়েছে যে এটি ইনপুট ফাইলের আকারের জন্য উদ্বেগ ছাড়াই চিরতরে চলে যেতে পারে তবে এটি অনেক বেশি নিম্ন-স্তরের কারণ এটি ব্যবহারকারীর সমস্ত প্রকৃত প্রসেসিংয়ের কাজ করতে হবে (সরবরাহ করে) কল-চিত্)। আপনার আসল প্রশ্নে ফিরে যেতে, "ইভেন্ট-ভিত্তিক" শব্দটি সেই পার্সিং ইভেন্টগুলিকে বোঝায় যেগুলি পার্সার উত্সাহিত করে যা এক্সএমএল ফাইলটিকে অতিক্রম করে।

Wikipedia নিবন্ধটি SAX পার্সিং এর পর্যায়ে অনেক বিবরণ আছে।


11

আমি এই প্রশ্নের জন্য সাধারণ প্রশ্নোত্তর ও উত্তরমুখী উত্তর সরবরাহ করব:

প্রশ্নের উত্তর

কেন আমাদের এক্সএমএল পার্সার দরকার?

আমাদের এক্সএমএল পার্সার প্রয়োজন কারণ আমরা স্ক্র্যাচ থেকে আমাদের অ্যাপ্লিকেশনটিতে সমস্ত কিছু করতে চাই না এবং আমাদের জন্য খুব নিম্ন-স্তরের তবে খুব প্রয়োজনীয় কিছু করার জন্য আমাদের কিছু "সহায়ক" প্রোগ্রাম বা গ্রন্থাগার প্রয়োজন। এই নিম্ন-স্তরের তবে প্রয়োজনীয় বিষয়গুলির মধ্যে রয়েছে সুগঠিততা পরীক্ষা করা, এটির ডিটিডি বা স্কিমা (কেবলমাত্র পার্সারদের বৈধতা দেওয়ার জন্য) এর বিরুদ্ধে নথিটি বৈধতা দেওয়া, চরিত্রের রেফারেন্স সমাধান করা, সিডিএটিএ বিভাগগুলি বোঝা ইত্যাদি and এক্সএমএল পার্সারগুলি কেবল "সহায়ক" প্রোগ্রাম এবং তারা এই সমস্ত কাজ করবে। এক্সএমএল পার্সারের সাহায্যে আমরা এই জটিলতাগুলির অনেকগুলি থেকে রক্ষা পেয়েছি এবং পার্সারদের দ্বারা প্রয়োগ করা এপিআই এর মাধ্যমে আমরা কেবলমাত্র উচ্চ স্তরে প্রোগ্রামিংয়ে নিজেকে মনোনিবেশ করতে পারি এবং এভাবে প্রোগ্রামিং দক্ষতা অর্জন করতে পারি।

স্যাক্স বা ডিওএম কোনটি ভাল?

SAX এবং DOM পার্সার উভয়েরই তাদের সুবিধা এবং অসুবিধা রয়েছে ages কোনটি আরও ভাল তা আপনার আবেদনের বৈশিষ্ট্যের উপর নির্ভর করতে হবে (দয়া করে নীচে কিছু প্রশ্ন দেখুন)।

কোন পার্সার আরও ভাল গতি, DOM বা SAX পার্সার পেতে পারে?

SAX পার্সার আরও ভাল গতি পেতে পারে।

ট্রি-ভিত্তিক এপিআই এবং ইভেন্ট-ভিত্তিক এপিআইয়ের মধ্যে পার্থক্য কী?

একটি ট্রি-ভিত্তিক এপিআই একটি গাছের কাঠামোর চারপাশে কেন্দ্রীভূত হয় এবং তাই কোনও গাছের উপাদানগুলিতে ইন্টারফেস সরবরাহ করে (যা একটি ডিওএম ডকুমেন্ট) যেমন ডকুমেন্ট ইন্টারফেস, নোড ইন্টারফেস, নোডলিস্ট ইন্টারফেস, এলিমেন্ট ইন্টারফেস, অ্যাট্রিক ইন্টারফেস ইত্যাদি। বিপরীতে, তবে, ইভেন্ট-ভিত্তিক এপিআই হ্যান্ডলারগুলিতে ইন্টারফেস সরবরাহ করে। চারটি হ্যান্ডলার ইন্টারফেস, কন্টেন্টহ্যান্ডলার ইন্টারফেস, ডিটিডিহ্যান্ডলার ইন্টারফেস, অ্যান্টিটি রিসোলভার ইন্টারফেস এবং ত্রুটিহ্যান্ডলার ইন্টারফেস রয়েছে।

একটি ডিওএম পার্সার এবং একটি স্যাক্স পার্সারের মধ্যে পার্থক্য কী?

ডোম পার্সার এবং স্যাক্স পার্সারগুলি বিভিন্ন উপায়ে কাজ করে:

  • একটি ডিওএম পার্সার ইনপুট ডকুমেন্ট থেকে মেমরিতে গাছের কাঠামো তৈরি করে এবং তারপরে ক্লায়েন্টের অনুরোধের জন্য অপেক্ষা করে। তবে একটি স্যাক্স পার্সার কোনও অভ্যন্তরীণ কাঠামো তৈরি করে না। পরিবর্তে, এটি একটি ইনপুট নথির উপাদানগুলির ইভেন্টগুলি ঘটনা হিসাবে গ্রহণ করে এবং ক্লায়েন্টকে ইনপুট নথির মাধ্যমে পড়তে পড়তে বলে tells একজন

  • ডোম পার্সার সর্বদা ক্লায়েন্টের অ্যাপ্লিকেশনটি পুরো নথির সাথে পরিবেশন করে, ক্লায়েন্টের পক্ষে আসলে কতটা প্রয়োজন তা বিবেচনা করে না। তবে একটি SAX পার্সার ক্লায়েন্ট অ্যাপ্লিকেশনটি সর্বদা কেবলমাত্র নথির কিছু অংশের সাথে কোনও নির্দিষ্ট সময়ে পরিবেশন করে।

  • ডিওএম পার্সারের সাহায্যে ক্লায়েন্ট অ্যাপ্লিকেশনগুলিতে মেথড কলগুলি স্পষ্ট করতে হবে এবং এক ধরণের চেইন তৈরি করতে হবে। তবে স্যাক্সের সাহায্যে কিছু নির্দিষ্ট পদ্ধতি (সাধারণত সাইয়েন্ট দ্বারা ওভার্রাইডেন) এমনভাবে স্বয়ংক্রিয়ভাবে (অন্তর্নিহিত) ডাকা হবে যা কিছু নির্দিষ্ট ঘটনা ঘটলে "কলব্যাক" বলে called এই পদ্ধতিগুলি ক্লায়েন্টের দ্বারা স্পষ্টভাবে কল করতে হবে না, যদিও আমরা তাদের স্পষ্টভাবে কল করতে পারি।

কোন পার্সার ভাল তা আমরা কীভাবে সিদ্ধান্ত নেব?

আদর্শভাবে একটি ভাল পার্সার দ্রুত (সময় দক্ষ), স্থান দক্ষ, কার্যক্ষমতায় সমৃদ্ধ এবং সহজে ব্যবহারযোগ্য হওয়া উচিত। তবে বাস্তবে, প্রধান পার্সারগুলির কোনওটিরই একই সময়ে এই সমস্ত বৈশিষ্ট্য নেই। উদাহরণস্বরূপ, একটি ডিওএম পার্সার কার্যক্ষমতায় সমৃদ্ধ (কারণ এটি স্মৃতিতে একটি ডম গাছ তৈরি করে এবং আপনাকে বারবার নথির যে কোনও অংশে অ্যাক্সেস করতে দেয় এবং আপনাকে ডিওএম ট্রি সংশোধন করার অনুমতি দেয়), তবে নথিটি বিশাল হলে স্থান অকার্যকর হয় , এবং এটির সাথে কীভাবে কাজ করা যায় তা শিখতে একটু সময় লাগে। একটি SAX পার্সার, তবে বড় ইনপুট ডকুমেন্টের ক্ষেত্রে আরও অনেক বেশি দক্ষ দক্ষ (কারণ এটি কোনও অভ্যন্তরীণ কাঠামো তৈরি করে না)। আরও কী, এটি দ্রুত চালিত হয় এবং এটি ডম পার্সারের চেয়ে শিখতে সহজ কারণ এর এপিআই সত্যই সহজ। তবে কার্যকারিতার দিক থেকে, এটি কম ফাংশন সরবরাহ করে যার অর্থ ব্যবহারকারীরা নিজেরাই আরও বেশি যত্ন নিতে হবে যেমন তাদের নিজস্ব ডেটা কাঠামো তৈরি করা। যাইহোক, একটি ভাল পার্সার কি? আমি মনে করি উত্তরটি আপনার আবেদনের বৈশিষ্ট্যের উপর নির্ভর করে।

এমন কিছু আসল ওয়ার্ল্ড অ্যাপ্লিকেশন কী কী যেখানে স্যাক্স পার্সার ব্যবহার করা ডিওএম পার্সার এবং তার বিপরীতে ব্যবহারের চেয়ে সুবিধাজনক? ডিওএম পার্সার এবং স্যাক্স পার্সারের জন্য সাধারণ অ্যাপ্লিকেশন কী?

নিম্নলিখিত ক্ষেত্রে, স্যাক্স পার্সার ব্যবহার করা ডিওএম পার্সার ব্যবহারের চেয়ে সুবিধাজনক।

  • ইনপুট ডকুমেন্ট উপলব্ধ মেমরির জন্য খুব বড় (আসলে এই ক্ষেত্রে SAX আপনার একমাত্র পছন্দ)
  • আপনি ইনপুটটির সামঞ্জস্যপূর্ণ ছোট ছোট অংশে দস্তাবেজটি প্রক্রিয়া করতে পারেন। আপনি দরকারী কাজ করার আগে পুরো দস্তাবেজের দরকার নেই need
  • আপনি আগ্রহের তথ্যগুলি বের করার জন্য কেবল পার্সার ব্যবহার করতে চান এবং আপনার সমস্ত গণনা সম্পূর্ণরূপে নিজের তৈরি ডেটা স্ট্রাকচারের উপর ভিত্তি করে তৈরি করা হবে। আসলে আমাদের বেশিরভাগ অ্যাপ্লিকেশনগুলিতে আমরা আমাদের নিজস্ব ডেটা স্ট্রাকচার তৈরি করি যা সাধারণত ডিওএম গাছের মতো জটিল হয় না। এই ধারণা থেকে, আমি মনে করি, একটি স্যাক্স পার্সার ব্যবহারের চেয়ে ডিওএম পার্সার ব্যবহারের সুযোগ কম।

নিম্নলিখিত ক্ষেত্রে, ডিএএম পার্সার ব্যবহার করা স্যাক্স পার্সার ব্যবহারের চেয়ে সুবিধাজনক।

  • আপনার অ্যাপ্লিকেশনটির একই সাথে নথির কিছু অংশ পৃথকভাবে অ্যাক্সেস করা দরকার।
  • আপনার অ্যাপ্লিকেশন সম্ভবত একটি অভ্যন্তরীণ ডেটা কাঠামো ব্যবহার করতে পারে যা ডকুমেন্টের মতোই প্রায় জটিল।
  • আপনার অ্যাপ্লিকেশনটি বারবার দস্তাবেজটি সংশোধন করতে হবে।
  • আপনার অ্যাপ্লিকেশনটিতে অনেকগুলি পদ্ধতি কলের মাধ্যমে উল্লেখযোগ্য পরিমাণে দস্তাবেজটি সংরক্ষণ করতে হবে।

উদাহরণ (একটি ডোম পার্সার বা একটি স্যাক্স পার্সার ব্যবহার করবেন?):

অনুমান করুন যে একজন প্রশিক্ষকের কাছে একটি এক্সএমএল নথি রয়েছে যা ছাত্রদের সমস্ত ব্যক্তিগত তথ্য এবং সেইসাথে তার ছাত্ররা তার ক্লাসে তৈরি পয়েন্টগুলি ধারণ করে এবং এখন তিনি একটি অ্যাপ্লিকেশন ব্যবহার করে শিক্ষার্থীদের জন্য চূড়ান্ত গ্রেড বরাদ্দ করছেন। তিনি কী উত্পাদন করতে চান, তা এসএসএন এবং গ্রেড সহ একটি তালিকা। এছাড়াও আমরা ধরে নিই যে তার প্রয়োগে, প্রশিক্ষক শিক্ষার্থীর ব্যক্তিগত তথ্য এবং পয়েন্টগুলি সঞ্চয় করতে অ্যারের মতো কোনও ডেটা স্ট্রাকচার ব্যবহার করেন না। প্রশিক্ষক যদি সিদ্ধান্ত নেন যে যারা ক্লাস গড় বা তদূর্ধ্ব প্রাপ্ত ব্যক্তিদের এ প্রদান করেন এবং অন্যকে বি প্রদান করেন, তবে তিনি তার অ্যাপ্লিকেশনটিতে একটি ডম পার্সার ব্যবহার করা ভাল। কারণটি হ'ল পুরো ডকুমেন্টটি প্রক্রিয়াজাত হওয়ার আগে ক্লাসের গড় কত তার জানার কোনও উপায় নেই। তাঁর আবেদনে সম্ভবত তাঁর যা করা দরকার তা হ'ল প্রথমে সমস্ত শিক্ষার্থীর মধ্যে নজর দেওয়া উচিত ' পয়েন্ট এবং গড় গণনা করুন, এবং তারপরে আবার দস্তাবেজটি দেখুন এবং প্রতিটি ছাত্রকে তিনি ক্লাস গড়ের সাথে অর্জিত পয়েন্টগুলির সাথে তুলনা করে চূড়ান্ত গ্রেড অর্পণ করুন। তবে যাইহোক, প্রশিক্ষক যদি এমন গ্রেডিং নীতি গ্রহণ করেন যে 90% বা ততোধিক সংখ্যক শিক্ষার্থী এ এর ​​জন্য এবং অন্যকে বি'র নিয়োগ দেওয়া হয়, তবে সম্ভবত তিনি SAX পার্সার ব্যবহার করতে পারেন। কারণটি হ'ল, প্রতিটি শিক্ষার্থীকে একটি চূড়ান্ত গ্রেড অর্পণ করতে, পুরো ডকুমেন্টটি প্রক্রিয়া করার জন্য তার অপেক্ষা করার দরকার নেই। স্যাক্স পার্সার যখন এই শিক্ষার্থীর গ্রেড পড়েন তখন তিনি তত্ক্ষণাত একজন ছাত্রকে গ্রেড অর্পণ করতে পারেন। উপরের বিশ্লেষণে, আমরা ধরে নিয়েছি যে প্রশিক্ষক তার নিজস্ব কোনও ডেটা কাঠামো তৈরি করেন নি। যদি সে তার নিজস্ব ডেটা স্ট্রাকচার তৈরি করে, যেমন এসএসএন সংরক্ষণ করার জন্য স্ট্রিংগুলির একটি অ্যারের এবং বিন্দুগুলি স্থির রাখতে পূর্ণসংখ্যার একটি অ্যারে? এক্ষেত্রে, আমি মনে করি স্যাক্স একটি ভাল পছন্দ, এর আগে স্মৃতি এবং সময় উভয়ই সাশ্রয় করতে পারে, তবুও কাজটি সম্পন্ন করবে। ঠিক আছে, এই উদাহরণে আরও একটি বিবেচনা। প্রশিক্ষক কী করতে চান তা যদি কোনও তালিকা মুদ্রণ না করে, তবে প্রতিটি শিক্ষার্থীর গ্রেড আপডেট হওয়া সাথে মূল দস্তাবেজটি সংরক্ষণ করতে হয়? এক্ষেত্রে, ডিওএম পার্সারটি যে কোনও গ্রেডিং নীতি গ্রহণ করুক না কেন তার চেয়ে ভাল পছন্দ হওয়া উচিত। তার নিজস্ব কোনও ডেটা স্ট্রাকচার তৈরি করার দরকার নেই। তার যা করা দরকার তা হ'ল প্রথমে ডিওএম ট্রিটি সংশোধন করা (অর্থাত্ 'গ্রেড' নোডের মান নির্ধারণ করা) এবং তারপরে পুরো পরিবর্তিত গাছটি সংরক্ষণ করা। যদি তিনি ডিওএম পার্সারের পরিবর্তে স্যাক্স পার্সার ব্যবহার করতে চান, তবে এই ক্ষেত্রে তাকে একটি ডেটা স্ট্রাকচার তৈরি করতে হবে যা কাজ সম্পাদন করার আগে ডম গাছের মতো প্রায় জটিল। তবুও কাজ শেষ কর। ঠিক আছে, এই উদাহরণে আরও একটি বিবেচনা। প্রশিক্ষক কী করতে চান তা যদি কোনও তালিকা মুদ্রণ না করে, তবে প্রতিটি শিক্ষার্থীর গ্রেড আপডেট হওয়া সাথে মূল দস্তাবেজটি সংরক্ষণ করতে হয়? এক্ষেত্রে, ডিওএম পার্সারটি যে কোনও গ্রেডিং নীতি গ্রহণ করুক না কেন তার চেয়ে ভাল পছন্দ হওয়া উচিত। তার নিজস্ব কোনও ডেটা স্ট্রাকচার তৈরি করার দরকার নেই। তার যা করা দরকার তা হ'ল প্রথমে ডিওএম ট্রিটি সংশোধন করা (অর্থাত্ 'গ্রেড' নোডের মান নির্ধারণ করা) এবং তারপরে পুরো পরিবর্তিত গাছটি সংরক্ষণ করা। যদি তিনি ডিওএম পার্সারের পরিবর্তে স্যাক্স পার্সার ব্যবহার করতে চান, তবে এই ক্ষেত্রে তাকে একটি ডেটা স্ট্রাকচার তৈরি করতে হবে যা কাজ সম্পাদন করার আগে ডম গাছের মতো প্রায় জটিল। তবুও কাজ শেষ কর ঠিক আছে, এই উদাহরণে আরও একটি বিবেচনা। প্রশিক্ষক কী করতে চান তা যদি কোনও তালিকা মুদ্রণ না করে, তবে প্রতিটি শিক্ষার্থীর গ্রেড আপডেট হওয়া সাথে মূল দস্তাবেজটি সংরক্ষণ করতে হয়? এক্ষেত্রে, ডিওএম পার্সারটি যে কোনও গ্রেডিং নীতি গ্রহণ করুক না কেন তার চেয়ে ভাল পছন্দ হওয়া উচিত। তার নিজস্ব কোনও ডেটা স্ট্রাকচার তৈরি করার দরকার নেই। তার যা করা দরকার তা হ'ল প্রথমে ডিওএম ট্রিটি সংশোধন করা (অর্থাত্ 'গ্রেড' নোডের মান নির্ধারণ করা) এবং তারপরে পুরো পরিবর্তিত গাছটি সংরক্ষণ করা। যদি তিনি ডিওএম পার্সারের পরিবর্তে স্যাক্স পার্সার ব্যবহার করতে চান, তবে এই ক্ষেত্রে তাকে একটি ডেটা স্ট্রাকচার তৈরি করতে হবে যা কাজ সম্পাদন করার আগে ডম গাছের মতো প্রায় জটিল। তবে প্রতিটি শিক্ষার্থীর গ্রেড আপডেট করে মূল ডকুমেন্টটি সংরক্ষণ করতে হবে? এক্ষেত্রে, ডিওএম পার্সারটি যে কোনও গ্রেডিং নীতি গ্রহণ করুক না কেন তার চেয়ে ভাল পছন্দ হওয়া উচিত। তার নিজস্ব কোনও ডেটা স্ট্রাকচার তৈরি করার দরকার নেই। তার যা করা দরকার তা হ'ল প্রথমে ডিওএম ট্রিটি সংশোধন করা (অর্থাত্ 'গ্রেড' নোডের মান নির্ধারণ করা) এবং তারপরে পুরো পরিবর্তিত গাছটি সংরক্ষণ করা। যদি তিনি ডিওএম পার্সারের পরিবর্তে স্যাক্স পার্সার ব্যবহার করতে চান, তবে এই ক্ষেত্রে তাকে একটি ডেটা স্ট্রাকচার তৈরি করতে হবে যা কাজ সম্পাদন করার আগে ডম গাছের মতো প্রায় জটিল। তবে প্রতিটি শিক্ষার্থীর গ্রেড আপডেট করে মূল ডকুমেন্টটি সংরক্ষণ করতে হবে? এক্ষেত্রে, ডিওএম পার্সারটি যে কোনও গ্রেডিং নীতি গ্রহণ করুক না কেন তার চেয়ে ভাল পছন্দ হওয়া উচিত। তার নিজস্ব কোনও ডেটা স্ট্রাকচার তৈরি করার দরকার নেই। তার যা করা দরকার তা হ'ল প্রথমে ডিওএম ট্রিটি সংশোধন করা (অর্থাত্ 'গ্রেড' নোডের মান নির্ধারণ করা) এবং তারপরে পুরো পরিবর্তিত গাছটি সংরক্ষণ করা। যদি তিনি ডিওএম পার্সারের পরিবর্তে স্যাক্স পার্সার ব্যবহার করতে চান, তবে এই ক্ষেত্রে তাকে একটি ডেটা স্ট্রাকচার তৈরি করতে হবে যা কাজ সম্পাদন করার আগে ডম গাছের মতো প্রায় জটিল। নোড) এবং তারপরে পুরো পরিবর্তিত গাছটি সংরক্ষণ করুন। যদি তিনি ডিওএম পার্সারের পরিবর্তে স্যাক্স পার্সার ব্যবহার করতে চান, তবে এই ক্ষেত্রে তাকে একটি ডেটা স্ট্রাকচার তৈরি করতে হবে যা কাজ সম্পাদন করার আগে ডম গাছের মতো প্রায় জটিল। নোড) এবং তারপরে পুরো পরিবর্তিত গাছটি সংরক্ষণ করুন। যদি তিনি ডিওএম পার্সারের পরিবর্তে স্যাক্স পার্সার ব্যবহার করতে চান, তবে এই ক্ষেত্রে তাকে একটি ডেটা স্ট্রাকচার তৈরি করতে হবে যা কাজ সম্পাদন করার আগে ডম গাছের মতো প্রায় জটিল।

একটি উদাহরণ

সমস্যার বিবৃতি : প্রদত্ত এক্সএমএল ডকুমেন্টের উপাদানগুলির মধ্যে চেনাশোনাগুলি সম্পর্কিত সমস্ত তথ্য বের করার জন্য একটি জাভা প্রোগ্রাম লিখুন। আমরা ধরে নিই যে প্রতিটি চেনাশোনা উপাদানের তিনটি শিশু উপাদান (অর্থাত্, x, y এবং ব্যাসার্ধ) পাশাপাশি একটি বর্ণ বৈশিষ্ট্য রয়েছে। একটি নমুনা নথি নীচে দেওয়া হয়েছে:

<?xml version="1.0"?> 
<!DOCTYPE shapes [
<!ELEMENT shapes (circle)*>
<!ELEMENT circle (x,y,radius)>
<!ELEMENT x (#PCDATA)>
<!ELEMENT y (#PCDATA)>
<!ELEMENT radius (#PCDATA)>
<!ATTLIST circle color CDATA #IMPLIED>
]>

<shapes> 
          <circle color="BLUE"> 
                <x>20</x>
                <y>20</y>
                <radius>20</radius> 
          </circle>
          <circle color="RED" >
                <x>40</x>
                <y>40</y>
                <radius>20</radius> 
          </circle>
</shapes> 

DOMparser সঙ্গে প্রোগ্রাম

import java.io.*;
import org.w3c.dom.*;
import org.apache.xerces.parsers.DOMParser;


public class shapes_DOM {
   static int numberOfCircles = 0;   // total number of circles seen
   static int x[] = new int[1000];   // X-coordinates of the centers
   static int y[] = new int[1000];   // Y-coordinates of the centers  
   static int r[] = new int[1000];   // radius of the circle
   static String color[] = new String[1000];  // colors of the circles 

   public static void main(String[] args) {   

      try{
         // create a DOMParser
         DOMParser parser=new DOMParser();
         parser.parse(args[0]);

         // get the DOM Document object
         Document doc=parser.getDocument();

         // get all the circle nodes
         NodeList nodelist = doc.getElementsByTagName("circle");
         numberOfCircles =  nodelist.getLength();

         // retrieve all info about the circles
         for(int i=0; i<nodelist.getLength(); i++) {

            // get one circle node
            Node node = nodelist.item(i);

            // get the color attribute 
            NamedNodeMap attrs = node.getAttributes();
            if(attrs.getLength() > 0)
               color[i]=(String)attrs.getNamedItem("color").getNodeValue();

            // get the child nodes of a circle node 
            NodeList childnodelist = node.getChildNodes();

            // get the x and y value 
            for(int j=0; j<childnodelist.getLength(); j++) {
               Node childnode = childnodelist.item(j);
               Node textnode = childnode.getFirstChild();//the only text node
               String childnodename=childnode.getNodeName(); 
               if(childnodename.equals("x")) 
                  x[i]= Integer.parseInt(textnode.getNodeValue().trim());
               else if(childnodename.equals("y")) 
                  y[i]= Integer.parseInt(textnode.getNodeValue().trim());
               else if(childnodename.equals("radius")) 
                  r[i]= Integer.parseInt(textnode.getNodeValue().trim());
            }

         }

         // print the result
         System.out.println("circles="+numberOfCircles);
         for(int i=0;i<numberOfCircles;i++) {
             String line="";
             line=line+"(x="+x[i]+",y="+y[i]+",r="+r[i]+",color="+color[i]+")";
             System.out.println(line);
         }

      }  catch (Exception e) {e.printStackTrace(System.err);}

    }

}

SAXparser সহ প্রোগ্রাম

import java.io.*;
import org.xml.sax.*;
import org.xml.sax.helpers.DefaultHandler;
import org.apache.xerces.parsers.SAXParser;


public class shapes_SAX extends DefaultHandler {

   static int numberOfCircles = 0;   // total number of circles seen
   static int x[] = new int[1000];   // X-coordinates of the centers
   static int y[] = new int[1000];   // Y-coordinates of the centers
   static int r[] = new int[1000];   // radius of the circle
   static String color[] = new String[1000];  // colors of the circles

   static int flagX=0;    //to remember what element has occurred
   static int flagY=0;    //to remember what element has occurred
   static int flagR=0;    //to remember what element has occurred

   // main method 
   public static void main(String[] args) {   
      try{
         shapes_SAX SAXHandler = new shapes_SAX (); // an instance of this class
         SAXParser parser=new SAXParser();          // create a SAXParser object 
         parser.setContentHandler(SAXHandler);      // register with the ContentHandler 
         parser.parse(args[0]);
      }  catch (Exception e) {e.printStackTrace(System.err);}  // catch exeptions
   }

   // override the startElement() method
   public void startElement(String uri, String localName, 
                       String rawName, Attributes attributes) {
         if(rawName.equals("circle"))                      // if a circle element is seen
            color[numberOfCircles]=attributes.getValue("color");  // get the color attribute 

         else if(rawName.equals("x"))      // if a x element is seen set the flag as 1 
            flagX=1;
         else if(rawName.equals("y"))      // if a y element is seen set the flag as 2
            flagY=1;
         else if(rawName.equals("radius")) // if a radius element is seen set the flag as 3 
            flagR=1;
   }

   // override the endElement() method
   public void endElement(String uri, String localName, String rawName) {
         // in this example we do not need to do anything else here
         if(rawName.equals("circle"))                       // if a circle element is ended 
            numberOfCircles +=  1;                          // increment the counter 
   }

   // override the characters() method
   public void characters(char characters[], int start, int length) {
         String characterData = 
             (new String(characters,start,length)).trim(); // get the text

         if(flagX==1) {        // indicate this text is for <x> element 
             x[numberOfCircles] = Integer.parseInt(characterData);
             flagX=0;
         }
         else if(flagY==1) {  // indicate this text is for <y> element 
             y[numberOfCircles] = Integer.parseInt(characterData);
             flagY=0;
         }
         else if(flagR==1) {  // indicate this text is for <radius> element 
             r[numberOfCircles] = Integer.parseInt(characterData);
             flagR=0;
         }
   }

   // override the endDocument() method
   public void endDocument() {
         // when the end of document is seen, just print the circle info 
         System.out.println("circles="+numberOfCircles);
         for(int i=0;i<numberOfCircles;i++) {
             String line="";
             line=line+"(x="+x[i]+",y="+y[i]+",r="+r[i]+",color="+color[i]+")";
             System.out.println(line);
         }
   }


}

6

ব্যবহারিক ক্ষেত্রে: book.xML

<bookstore>
  <book category="cooking">
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>
    <year>2005</year>
    <price>30.00</price>
  </book>
</bookstore>
  • ডিওএম xML ডকুমেন্টটিকে মেমরিতে নিম্নলিখিত গাছ-কাঠামো হিসাবে উপস্থাপন করে ।
  • ডোম ডাব্লু 3 সি স্ট্যান্ডার্ড।
  • ডোম পার্সার ডকুমেন্ট অবজেক্ট মডেলটিতে কাজ করে।
  • ছোট এক্সএমএল নথিগুলির জন্য পছন্দসই, ডিওএম আরও মেমরি নিয়েছে occup
  • DOM সামনের দিকে বা পিছনে নেভিগেট করা সহজ।

এখানে চিত্র বর্ণনা লিখুন


  • SAX যেমন XML দস্তাবেজে উপস্থাপন ভিত্তি করে ইভেন্টের মত start element:abc, end element:abc
  • SAX ডাব্লু 3 সি স্ট্যান্ডার্ড নয়, এটি বিকাশকারীদের গ্রুপ দ্বারা তৈরি করা হয়েছিল।
  • SAX মেমরি ব্যবহার করে না, বড় এক্সএমএল নথিগুলির জন্য পছন্দসই।
  • পশ্চাদগামী নেভিগেশনটি নথির ক্রমানুসারে প্রক্রিয়াজাতকরণের কারণে সম্ভব নয়।
  • ইভেন্টটি কোনও নোড / উপাদানকে ঘটে এবং এটি সমস্ত উপ নোড দেয় (ল্যাটিন নোডাস, 'নট')।

এই এক্সএমএল নথিটি যখন স্যাক্স পার্সারের মধ্য দিয়ে যায়, নিম্নলিখিত ইভেন্টগুলির ক্রম উত্পন্ন করে :

start element: bookstore
start element: book with an attribute category equal to cooking
start element: title with an attribute lang equal to en
Text node, with data equal to Everyday Italian
....
end element: title
.....
end element: book
end element: bookstore

attr: "lang"উপরে কেন element: <title>ডম পার্সিংয়ের ভিজ্যুয়াল উপস্থাপনায় রয়েছে? এক্সএমএল এ খুঁজছি, এটা দেখে মনে হচ্ছে একটি attrতার সমান্তরাল হওয়া উচিত <element>মত <book>এবং category। এটি কি কেবল একটি স্থান-সংরক্ষণের কৌশল বা অভিভাবক-সন্তানের সম্পর্কের উদ্দেশ্য রয়েছে?
1252748

এটি কেবল একটি স্থান সাশ্রয় করার কৌশল
প্রেমরাজ

3

DOM ডকুমেন্ট অবজেক্ট মডেলের জন্য দাঁড়ায় এবং এটি গাছের ফর্ম্যাটে একটি এক্সএমএল ডকুমেন্টকে প্রতিনিধিত্ব করে যা প্রতিটি উপাদান গাছের শাখাগুলি উপস্থাপন করে। ডোম পার্সার এক্সএমএল ফাইলের একটি ইন মেমোরি ট্রি উপস্থাপনা তৈরি করে এবং এর পরে এটি বিশ্লেষণ করে, তাই এটি আরও মেমরির প্রয়োজন এবং জাভা.এল.আউটআফমেমরিরির: জাভা হিপ স্পেস এড়ানোর জন্য ডিওএম পার্সারের জন্য হ্যাপের আকার বাড়ানো উচিত। এক্সএমএল ফাইলটি ডিওএম পার্সার ব্যবহার করে পার্সিং করা খুব দ্রুত যদি এক্সএমএল ফাইলটি ছোট হয় তবে আপনি যদি ডোম পার্সার ব্যবহার করে একটি বড় এক্সএমএল ফাইলটি পড়ার চেষ্টা করেন তবে এটির অনেক বেশি সময় লাগবে এমনকি এমনকি এটি পুরোপুরি লোড করতে সক্ষম নাও হতে পারে কারণ এক্সএমএল ডোম ট্রি তৈরি করতে এর প্রচুর স্মৃতি দরকার। জাভা সমর্থন ডোম পার্সিং সরবরাহ করে এবং আপনি জাভায় ডোম পার্সার ব্যবহার করে এক্সএমএল ফাইলগুলি পার্স করতে পারেন। ডোম ক্লাসগুলি ডাব্লু 3 সিডিএম প্যাকেজে রয়েছে যখন জাভার জন্য ডিওএম পার্সার জ্যাকএক্সপি (এক্সএমএল পার্সিংয়ের জন্য জাভা এপিআই) প্যাকেজে রয়েছে।

জাভায় SAX XML পার্সার

এসএএক্স এক্সএলএম পার্সিংয়ের জন্য সিম্পল এপিআই এর জন্য দাঁড়িয়েছে। এটি এক্সএলএমএল পার্সিং ভিত্তিক একটি ইভেন্ট এবং এটি এক্সএমএল ফাইল ধাপে ধাপে পার্স করে যাতে বড় এক্সএমএল ফাইলগুলির জন্য উপযুক্ত। স্যাক এক্সএমএল পার্সার যখন ইভেন্ট খোলার ট্যাগ, উপাদান বা বৈশিষ্ট্যটির মুখোমুখি হয় এবং পার্সিং ততক্ষণে কাজ করে event জাভাতে বড় এক্সএমএল ফাইল পার্স করার জন্য স্যাক্স এক্সএমএল পার্সার ব্যবহার করার পরামর্শ দেওয়া হয়েছে কারণ এটি জাভাতে পুরো এক্সএমএল ফাইল লোড করার প্রয়োজন হয় না এবং এটি ছোট অংশে একটি বড় এক্সএমএল ফাইল পড়তে পারে। জাভা স্যাক্স পার্সারের জন্য সমর্থন সরবরাহ করে এবং আপনি জাএক্সএক্সএক্স পার্সার ব্যবহার করে যে কোনও এক্সএমএল ফাইল পার্স করতে পারেন, আমি এখানে স্যাক্স পার্সার ব্যবহার করে এক্সএমএল ফাইলটি পড়ার উদাহরণ কভার করেছি। জাভাতে স্যাক্স পার্সার ব্যবহারের একটি অসুবিধা হ'ল জাভায় স্যাক্স পার্সার ব্যবহার করে এক্সএমএল ফাইলটি পড়ার জন্য ডিওএম পার্সারের তুলনায় আরও কোডের প্রয়োজন।

DOM এবং SAX XML পার্সারের মধ্যে পার্থক্য

জাভাতে ডিওএম পার্সার এবং স্যাক্স পার্সারের মধ্যে কয়েকটি উচ্চ স্তরের পার্থক্য রয়েছে:

1) ডোম পার্সার মেমরিতে পুরো এক্সএমএল ডকুমেন্টটি লোড করে যখন স্যাক্স কেবল মেমরিতে এক্সএমএল ফাইলের ছোট্ট অংশ লোড করে।

2) ডিওএম পার্সার SAX এর চেয়ে দ্রুততর কারণ এটি মেমরিতে পুরো এক্সএমএল ডকুমেন্টকে অ্যাক্সেস করে।

3) জাভাতে স্যাক্স পার্সার ডোম পার্সারের চেয়ে বড় এক্সএমএল ফাইলের জন্য ভাল উপযুক্ত কারণ এর জন্য খুব বেশি মেমরির প্রয়োজন হয় না।

4) ডোম পার্সার ডকুমেন্ট অবজেক্ট মডেলটিতে কাজ করে যখন স্যাক্স ইভেন্ট ভিত্তিক এক্সএমএল পার্সার।

আরও পড়ুন: http://javarevisited.blogspot.com/2011/12/differences-between-dom-and-sax-parsers.html#ixzz2uz1bJQqZ


2

স্যাক্স এবং ডম উভয়ই এক্সএমএল ডকুমেন্টকে বিশ্লেষণ করতে ব্যবহৃত হয়। উভয়েরই সুবিধা এবং অসুবিধা রয়েছে এবং পরিস্থিতি অনুসারে আমাদের প্রোগ্রামিংয়ে এটি ব্যবহার করা যেতে পারে

SAX:

  1. নোড দ্বারা পার্স নোড

  2. এক্সএমএল মেমরিতে সঞ্চয় করে না

  3. আমরা নোড sertোকাতে বা মুছতে পারি না

  4. শীর্ষ থেকে নীচে ট্র্যাভারসিং

করে DOM

  1. প্রক্রিয়া করার আগে পুরো এক্সএমএল ডকুমেন্টটিকে মেমরিতে সংরক্ষণ করে

  2. আরও স্মৃতি দখল করে

  3. আমরা নোড সন্নিবেশ করতে বা মুছতে পারি

  4. যেকোন দিকে যেতে হবে।

যদি আমাদের কোনও নোডের সন্ধান করতে হয় এবং সন্নিবেশ করতে বা মুছতে প্রয়োজন না হয় আমরা স্যাক্সের সাথে নিজেই যেতে পারি অন্যথায় যদি আমাদের আরও স্মৃতি থাকে D


1

1) ডম পার্সার সম্পূর্ণ এক্সএমএল ডকুমেন্টকে মেমরিতে লোড করে যখন স্যাক্স কেবল মেমরিতে এক্সএমএল ফাইলের একটি ছোট অংশ লোড করে।

2) ডিওএম পার্সার SAX এর চেয়ে দ্রুততর কারণ এটি মেমরিতে পুরো এক্সএমএল ডকুমেন্টকে অ্যাক্সেস করে।

3) জাভাতে স্যাক্স পার্সার ডোম পার্সারের চেয়ে বড় এক্সএমএল ফাইলের জন্য ভাল উপযুক্ত কারণ এর জন্য খুব বেশি মেমরির প্রয়োজন হয় না।

4) ডোম পার্সার ডকুমেন্ট অবজেক্ট মডেলটিতে কাজ করে যখন স্যাক্স ইভেন্ট ভিত্তিক এক্সএমএল পার্সার।

আরও পড়ুন: http://javarevisited.blogspot.com/2011/12/differences-between-dom-and-sax-parsers.html#ixzz498y3vPFR

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.