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