Tag Archives: এক্সএমএল
পিএইচপি – এক্সএমএল পার্সার (PHP XML Parsers)
এক্সএমএল কি?
এক্সএমএল ল্যাঙ্গুয়েজ হলো ডাটা বা তথ্যকে স্ট্রাকচার করার একটি পদ্ধতি যা ওয়েবসাইটগুলোতে তথ্য শেয়ার করার জন্য ব্যবহৃত হয়ে থাকে। আরএসএস ফিড এবং পডকাস্টের মতো অনেক ধরণের ওয়েব টেকনোলজি এক্সএমএল দিয়ে লেখা হয়। এক্সএমএল তৈরি করা সহজ। এটি অনেকটাই এইচটিএমএল এর মতো, পার্থক্য হলো এখানে আপনি নিজেই ট্যাগ তৈরি করেন; এইচটিএমএল এর ট্যাগগুলো ডব্লিওথ্রিসি'র নীতিমালা অনুসারে তৈরি হয়েছে। এক্সএমএল সম্পর্কে আরও জানতে আপনি আমাদের এক্সএমএল টিউটরিয়ালগুলো পড়ে দেখতে পারেন।
এক্সএমএল পার্সার কি?
একটি এক্সএমএল ডকুমেন্টকে পড়তে, আপডেট করতে, তৈরি এবং ম্যান্যুপিউলেট করতে একটি এক্সএমএল পার্সারের দরকার পড়ে। পিএইচপি'তে প্রধানত দুই ধরণের এক্সএমএল পার্সার রয়েছেঃ
১) ট্রি-বেজড পার্সার
২) ইভেন্ট-বেজড পার্সার
ট্রি-বেজড পার্সার
ট্রি-বেজড বা ট্রি নির্ভর পার্সার পুরো ডকুমেন্টকে মেমোরিতে ধারণ করে এবং এক্সএমএল ডকুমেন্টটিকে একটি ট্রি স্ট্রাকচারে রয়পান্তরিত করে। এটি পুরো ডকুমেন্টটিকে বিশ্লেষণ করে এবং ট্রি এলিমেন্টে (DOM) প্রবেশ (access) করতে দেয়।
একটি ক্ষুদ্রতর এক্সএমএল ডকুমেন্টের জন্য এই ধরণের পার্সার তুলনামূলকভাবে ভালো অপশান হয়ে থাকে, কিন্তু বড় এক্সএমএল ডকুমেন্টের ক্ষেত্রে পার্ফমেন্স (ধীর গতিতে পার্সা করে) ভালো হয়না বলে সেক্ষেত্রে এই ধরণের পার্সার ব্যবহার করা হয়না।
ট্রি-বেজড পার্সারের উদাহরণঃ
SimpleXML- DOM
ইভেন্ট-বেজড পার্সার
ইভেন্ট-বেজড বা ইভেন্ট নির্ভর পার্সার পুরো ডকুমেন্টকে মেমোরিতে ধারণ করেনা, তার পরিবর্তে, সেগুলো একবারে শুধু একটি নোডকে পড়ে এবং আপনাকে রিয়েল টাইমে ( যে সময়টিতে আপনি ডকুমেন্টটি নিয়ে কাজ করছেন) ডকুমেন্টের ঐ নোডটি'র সাথে ইন্টারেক্ট করতে দেয়। একবার আপনি পরবর্তী নোডে চলে গেলে পূর্বের নোডটি ফেলে দেয়া হয় মেমোরি থেকে।
বড় এক্সএমএল ডকুমেন্টের জন্য এই ধরণের পার্সার খুবই কার্যকর। এটি খুব দ্রুততর গতিতে পার্স করে এবং কম মেমোরি দখল করে।
ইভেন্ট বেজড পার্সারের উদাহরণঃ
- XMLReader
- XML Expat Parser
পিএইচপি – সিম্পল-এক্সএমএল পার্সার (PHP SimpleXML Parser in Bangla)
সিম্পল-এক্সএমএল (SimpleXML) হলো একটি পিএইচপি এক্সটেনশান যা আমাদেরকে সহজে এক্সএমএল ডাটা ম্যান্যুপিউলেট করতে এবং পেতে (get) সাহাজ্য করে।
সিম্পল-এক্সএমএল পার্সার
সিম্পল-এক্সএমএল একটি ট্রি-বেজড বা ট্রি নির্ভর পার্সার। যদি আপনি এক্সএমএল ডকুমেন্ট'টির স্ট্রাকচার বা লেআউট সম্পর্কে জেনে থাকেন তাহলে সিম্পল-এক্সএমএল একটি এলিমেন্টের নাম, এট্রিবিট এবং টেকচুয়াল ( টেক্সট) কন্টেন্টকে সহজেই পেতে সাহাজ্য করে।
সিম্পল-এক্সএমএল একটি এক্সএমএল ডকুমেন্টকে ডাটা স্ট্রাকচারে রূপান্তরিত করে যাকে নিয়ে আপনি এক গুচ্ছ এরে ( arrays ) বা অবজেক্টের মতো বারবার কাজ করতে পারেন। DOM অথবা এক্সপ্যাট পার্সারের তুলনায় সিম্পল-এক্সএমএল একটি এলিমেন্ট থেকে টেক্সট ডাটা পড়তে অল্প কিছু কোড লাইন নিয়ে কাজ করে।
ইন্সটলেশান
পিএইচপি-ফাইভ এ সিম্পল-এক্সএমএল ফাংশনগুলো পিএইচপি কোরেরই অংশ। এই ফাংশনগুলো ব্যবহার করতে কোন প্রকার ইন্টলেশনের দরকার পড়েনা।
পিএইচপি সিম্পল-এক্সএমএল - স্ট্রিং থেকে পড়া
পিএইচপি simplexml_load_string() ফাংশনটি একটি স্ট্রিং থেকে এক্সএমএল ডাটা পড়তে ব্যবহৃত হয়। মনে করি, নিচেরটির মতো আমাদের একটি এক্সএমএল ভ্যারিয়েবল রয়েছে যা এক্সএমএল ডাটা ধারণ করেঃ
$myXMLData = "<?xml version='1.0' encoding='UTF-8'?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>";
নিচের উদাহরণটি আমাদের দেখায়, কিভাবে simplexml_load_string() ফাংশনটিকে ব্যবহার করে একটি স্ট্রিং থেকে এক্সএমএল ডাটা পড়তে হয়ঃ
<?php $myXMLData = "<?xml version='1.0' encoding='UTF-8'?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>"; $xml=simplexml_load_string($myXMLData) or die("Error: Cannot create object"); print_r($xml); ?>
উপরের কোডটির আউটপুট হবেঃ
SimpleXMLElement Object ( [to] => Tove [from] => Jani [heading] => Reminder [body] => Don't forget me this weekend! )
এরর হ্যান্ডল করার টিপসঃ ডকুমেন্ট লোড করার সময় libxml ফাংশানালিটিকে সবগুলো এক্সএমএল এরর ত্রুটিকে ফিরে পেতে ব্যবহার করুন এবং তারপর এররগুলো সারানোর উপর কাজ করুনঃ
<?php libxml_use_internal_errors(true); $myXMLData = "<?xml version='1.0' encoding='UTF-8'?> <document> <user>John Doe</wronguser> <email>john@example.com</wrongemail> </document>"; $xml = simplexml_load_string($myXMLData); if ($xml === false) { echo "Failed loading XML: "; foreach(libxml_get_errors() as $error) { echo "<br>", $error->message; } } else { print_r($xml); } ?>
উপরের কোডটির আউটপুট হবেঃ
Failed loading XML:
Opening and ending tag mismatch: user line 3 and wronguser
Opening and ending tag mismatch: email line 4 and wrongemail
পিএইচপি সিম্পল-এক্সএমএল - ফাইল থেকে পড়া
পিএইচপি simplexml_load_file() ফাংশনটি একটি ফাইল থেকে এক্সএমএল ডাটা পড়তে ব্যবহৃত হয়। মনে করি আমাদের "note.xml" নামের একটি ফাইল রয়েছে যা নিচের মতো দেখায়ঃ
<?xml version="1.0" encoding="UTF-8"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>
নিচের উদাহরণটি আমাদেরকে দেখায়, কিভাবে simplexml_load_file() ফাংশনটি ব্যবহার করে ফাইল থেকে এক্সএমএল ডাটা পড়তে হয়ঃ
<?php $xml=simplexml_load_file("note.xml") or die("Error: Cannot create object"); print_r($xml); ?>
উপরের কোডটির আউটপুট হবেঃ
SimpleXMLElement Object ( [to] => Tove [from] => Jani [heading] => Reminder [body] => Don't forget me this weekend! )
টিপসঃ পরবর্তী অধ্যায়ে একটি এক্সএমএল ফাইল থেকে কিভাবে নোড ভ্যালুগুলো পেতে হয় তা দেখানো হবে।
পিএইচপি এক্সএমএল এক্সপ্যাট পার্সার (PHP XML Expat Parser in Bangla)
পিএইচপি'র বিল্ট-ইন এক্সএমএল এক্সপ্যাট পার্সার (XML Expat Parser) এক্সএমএল ডকুমেন্টকে পিএইচপি'তে প্রসেস করা সম্ভবপর করেছে।
এক্সএমএল এক্সপ্যাট পার্সার
এক্সপ্যাট পার্সারটি হলো ইভেন্ট-বেজড পার্সার অর্থাৎ এটি ইভেন্টের উপর নির্ভর করে একজিকিউট হয়। নিচের এক্সএমএল এর অংশটিকে দেখুনঃ
<from>Jani</from>
একটি ইভেন্ট-বেজড পার্সার উপরের এক্সএমএল'টিকে তিনটি ইভেন্টের সিরিজ হিসেবে রিপোর্ট করেঃ
- স্টার্ট এলিমেন্ট হলোঃ from
- CDATA সেকশানকে শুরু করে যার ভ্যালুঃ Jani
- ক্লোজ এলিমেন্টঃ from
এক্সএমএল এক্সপ্যাট পার্সার ফাংশনগুলো পিএইচপি কোরের অংশ। এই ফাংশনগুলোকে ব্যবহার করতে কোন ইন্সটলেশনের দরকার পড়েনা।
এক্সমএমএল ফাইল
নিচের উদাহরণে "note.xml" এক্সএমএল ফাইলটি ব্যবহৃত হবেঃ
<?xml version="1.0" encoding="UTF-8"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>
এক্সএমএল এক্সপ্যাট পার্সার'কে শুরু করা
আমরা চাই এক্সএমএল এক্সপ্যাট পার্সার'টিকে পিএইচপি'তে শুরু করতে, ভিন্ন ভিন্ন এক্সএমএল ইভেন্টের জন্য কিছু হ্যান্ডলার ডিফাইন করতে, এবং তারপর এক্সএমএল ফাইলটিকে পার্স করতে।
<?php // Initialize the XML parser $parser=xml_parser_create(); // Function to use at the start of an element function start($parser,$element_name,$element_attrs) { switch($element_name) { case "NOTE": echo "-- Note --<br>"; break; case "TO": echo "To: "; break; case "FROM": echo "From: "; break; case "HEADING": echo "Heading: "; break; case "BODY": echo "Message: "; } } // Function to use at the end of an element function stop($parser,$element_name) { echo "<br>"; } // Function to use when finding character data function char($parser,$data) { echo $data; } // Specify element handler xml_set_element_handler($parser,"start","stop"); // Specify data handler xml_set_character_data_handler($parser,"char"); // Open XML file $fp=fopen("note.xml","r"); // Read data while ($data=fread($fp,4096)) { xml_parse($parser,$data,feof($fp)) or die (sprintf("XML Error: %s at line %d", xml_error_string(xml_get_error_code($parser)), xml_get_current_line_number($parser))); } // Free the XML parser xml_parser_free($parser); ?>
উপরের উদাহরণটির ব্যাখ্যা
- xml_parser_create() ফাংশনের মাধ্যমে এক্সএমএল পার্সারটিকে শুরু করা হয়
- ভিন্ন ভিন্ন ইভেন্ট হ্যান্ডলারের সাথে ব্যবহারের জন্য ফাংশন তৈরি করা হয়
- যখন পার্সারটি ওপেনিং ও ক্লোজিং ট্যাগের সম্মুক্ষীণ হবে তখন কোন ফাংশনটি একজিকিউট হবে তা ঠিক করতে xml_set_element_handler() ফাংশনটিকে যোগ করা হয়।
- যখন পার্সারটি ক্যারেক্টার ডাটার সম্মুক্ষীণ হবে তখন কোন ফাংশনটি একজিকিউট হবে তা ঠিক করতে xml_set_character_data_handler() ফাংশনটিকে যোগ করা হয়।
- xml_parse() function ফাংশনের মাধ্যমে "note.xml" ফাইলটিকে পার্স করা হয়।
- কোন এরর বা সমস্যার ক্ষেত্রে, একটি এক্সএমএল এরর'কে টেক্সট ডেসক্রিপশানে কনভার্ট করতে xml_error_string() ফাংশনটিকে যোগ করা হয়।
- xml_parser_create() ফাংশনের সাথে নির্ধারণ করা মেমোরিকে মুক্ত করতে xml_parser_free() ফাংশনকে কল করা হয়।
পিএইচপি – এক্সএমএল DOM পার্সার (PHP XML DOM Parser in Bangla)
শেখ মাহফুজুর রহমান
পিএইচপি'র বিল্ট-ইন ডম (DOM) পার্সারের জন্য পিএইচপি'তে এক্সএমএল ডকুমেন্ট প্রসেস করা সম্ভব হয়েছে।
এক্সএমএল DOM পার্সার
DOM পার্সার একটি ট্রি-বেজড (DOM ট্রি) পার্সার। নিচের এক্সএমএল ডকুমেন্ট ফ্র্যাকশনটির দিকে তাকানঃ
<?xml version="1.0" encoding="UTF-8"?> <from>Jani</from>
DOM উপরের এক্সএমএল'টিকে একটি ট্রি স্ট্রাকচার হিসেবে দেখেঃ
লেভেল ১: এক্সএমএল ডকুমেন্ট
লেভেল ২: রুট এলিমেন্টঃ
লেভেল ৩: টেক্সট এলিমেন্টঃ "Jani"
ইন্সটলেশন
DOM পার্সার ফাংশনগুলো পিএইচপি কোরের অংশ। এই ফাংশনগুলোকে ব্যবহার করার জন্য কোন ইন্সটলেশনের দরকার পড়েনা।
একটি এক্সএমএল ফাইল
নিচের এক্সএমএল ফাইলটি আমাদের উদাহরণে ব্যবহৃত হবেঃ
<?xml version="1.0" encoding="UTF-8"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>
লোড এবং এক্সএমএল আউটপুট
আমরা চাই এক্সএমএল পার্সারটিকে চালু করতে, এক্সএমএল'টিকে লোড করতে এবং এটা থেকে আউটপুট পেতে।
উদাহরণঃ
<?php $xmlDoc = new DOMDocument(); $xmlDoc->load("note.xml"); print $xmlDoc->saveXML(); ?>
উপরের কোডটির আউটপুট হবেঃ
Tove Jani Reminder Don't forget me this weekend!
আপনি যদি ব্রাউজার উইন্ডোতে "View source" সিলেক্ট করেন তাহলে নিচের এইচটিএমএলটি দেখতে পাবেনঃ
<?xml version="1.0" encoding="UTF-8"?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>
উপরের উদাহরণটি একটি DOMDocument-Object তৈরি করে এবং "note.xml" থেকে এক্সএমএল'টিকে এর মধ্যে লোড করে। তারপর saveXML() ফাংশনটি ভিতরের এক্সএমএল ডকুমেন্টটিকে একটি স্ট্রিং-এ রাখে, ফলে আমরা এটিকে আউটপুট হিসেবে পেতে পারি।
এক্সএমএল এর মধ্যে দিয়ে লুপিং
আমরা চাই এক্সএমএল পার্সারটিকে চালু করতে, এক্সএমএল'টিকে লোড করতে এবং এলিমেন্টের সবগুলো এলিমেন্টের মধ্যে লুপ তৈরি করতেঃ
<?php $xmlDoc = new DOMDocument(); $xmlDoc->load("note.xml"); $x = $xmlDoc->documentElement; foreach ($x->childNodes AS $item) { print $item->nodeName . " = " . $item->nodeValue . "<br>"; } ?>
উপরের কোডটির আউটপুট হবেঃ
#text =
to = Tove
#text =
from = Jani
#text =
heading = Reminder
#text =
body = Don't forget me this weekend!
#text =
উপরের উদাহরণটিতে আপনি দেখতে পাবেন যে প্রত্যেকটি এলিমেন্টের মধ্যে খালি (empty) টেক্সট নোড রয়েছে। যখন এক্সএমএল তৈরি হয় তখন নোডগুলোর মধ্যে প্রায়ই হোয়াইট-স্পেস থাকে। এক্সএমএল DOM পার্সার এগুলোকে সাধারণত এলিমেন্ট হিসেবে বিবেচনা করে এবং আপনি যদি এগুলোর সম্পর্কে জ্ঞাত না হন তাহলে মাঝে মাঝে এগুলো সমস্যার সৃষ্টি করে।