PHP Data Format & Types
PHP XML Part-2
XML with PHP এর দ্বিতীয় পর্বে আপনাকে স্বাগতম , এই পর্বে আমরা দেখবো সম্পূর্ণ XML string থেকে নির্দিষ্ট অংশ নিয়ে কিভাবে নতুন XML তৈরী করবেন ? একটা xml file এ কিভাবে নতুন child element যোগ করবেন? XML File এর কোনো element এর attribute গুলো কিভাবে print করবেন? XML String কে কি JSON string এ রূপান্তর করা যাবে? XML এ xpath কি? এবং XML Namespaces কি?
সম্পূর্ণ XML string থেকে নির্দিষ্ট অংশ নিয়ে কিভাবে নতুন XML তৈরী করব?
সম্পূর্ণ XML string বা File থেকে কোনো নির্দিষ্ট অংশ নিয়ে নতুন XML file বা string তৈরী করতে হলে প্রথমে আপনাকে সেই নোডে (অংশে) access করতে হবে। তারপর asXML() function দিয়ে নতুন XML File তৈরী করতে হবে। নিচের উদাহরণ দেখুন:
<?php $xml=<<<"xml" <college> <student> <firstname>Nahida</firstname> <lastname>Sultana</lastname> <contact>01722334412</contact> <email>nahida@abc.com</email> <address> <district>Noakhali</district> <thana>Begum Gonj</thana> <post>3831</post> </address> </student> </college> xml; $sxe = new SimpleXMLElement($xml); print($sxe->student->address->asXML()); ?>
Output
আবার আপনি চাইলে নতুন file ও তৈরী করতে পারেন। নিচের উদাহরণ দেখুন:
<?php $xml=<<<"xml" <college> <student> <firstname>Nahida</firstname> <lastname>Sultana</lastname> <contact>01722334412</contact> <email>nahida@abc.com</email> <address> <district>Noakhali</district> <thana>Begum Gonj</thana> <post>3831</post> </address> </student> </college> xml; $sxe = new SimpleXMLElement($xml); print($sxe->student->address->asXML("address.xml")); ?>
এখন শুধু address অংশ নিয়ে আপনার address.xml নামে একটা file তৈরী হয়ে যাবে।
https://blog.w3programmers.com/php-course/
একটা xml file এ কিভাবে নতুন child element যোগ করবেন?
একটা xml file এ নতুন child element যোগ করতে চাইলে প্রথমে আপনাকে xml file টিকে load করে নিতে হবে। তারপর addChild() Method দিয়ে child add করতে হবে এবং asXML Method দিয়ে save করতে হবে। নিচের উদাহরণ দেখুন:
<?php $sxe = simplexml_load_file("test.xml"); $sxe->student->addChild("fathername","Karim Bapary"); echo $sxe->asXML("test.xml"); ?>
এখন আপনার XML file টি হবে নিচের মতো :
<?xml version="1.0"?> <college> <student> <firstname>Nahida</firstname> <lastname>Sultana</lastname> <contact>01722334412</contact> <email>nahida@abc.com</email> <address> <district>Noakhali</district> <thana>Begum Gonj</thana> <post>3831</post> </address> <fathername>Karim Bapary</fathername> </student> </college>
একটা xml Element এ কিভাবে নতুন attribute যোগ করবেন?
একটা xml Element এ নতুন attribute যোগ করতে হলে আপনাকে simpleXML ক্লাসের addAttribute() Method টি ব্যবহার করতে হবে। নিচের উদাহরণটি দেখুন:
<?php $sxe = simplexml_load_file("test.xml"); $sxe->student->address->addAttribute("type","Present Address"); echo $sxe->asXML("test.xml"); ?>
এখন আপনার address element এ type নামে একটা attribute দেখতে পাবেন , ঠিক নিচের মতো :
<?xml version="1.0"?> <college> <student> <firstname>Nahida</firstname> <lastname>Sultana</lastname> <contact>01722334412</contact> <email>nahida@abc.com</email> <address type="Present Address"> <district>Noakhali</district> <thana>Begum Gonj</thana> <post>3831</post> </address> <fathername>Karim Bapary</fathername> </student> </college>
XML File এর কোনো element এর attribute গুলো কিভাবে print করবেন?
XML File এর কোনো element এর attribute কে print করতে হলে আপনাকে attributes() Method টি ব্যবহার করতে হবে। নিচের উদাহরণটি দেখুন :
<?php $xml=<<<xml <?xml version="1.0"?> <college> <student> <firstname>Nahida</firstname> <lastname>Sultana</lastname> <contact>01722334412</contact> <email>nahida@abc.com</email> <address type="Present Address" title="Student Present Address"> <district>Noakhali</district> <thana>Begum Gonj</thana> <post>3831</post> </address> <fathername>Karim Bapary</fathername> </student> </college> xml; $sxe=simplexml_load_string($xml); foreach($sxe->student->address->attributes() as $attribute=>$value){ echo $attribute."=".$value,"<br>"; } // you can also print individual attribute value echo "<br><br>Print Individual Attribute Value<br>"; echo $sxe->student->address[0]->attributes(); ?>
Output
https://blog.w3programmers.com/php-course/
XML String কে কি JSON string এ রূপান্তর করা যাবে?
হ্যাঁ, অবশ্যই XML String কে JSON string এ রূপান্তর করা যাবে, আর তা json_encode() function দিয়েই করা সম্ভব। আবার আপনি চাইলে XML String কে json_decode() function এর মাধ্যমে PHP array অথবা Object এ রূপান্তর করে নিতে পারবেন। নিচের উদাহরণ কয়টি লক্ষ্য করুন:
<?php $xml=<<<xml <?xml version="1.0"?> <college> <student> <firstname>Nahida</firstname> <lastname>Sultana</lastname> <contact>01722334412</contact> <email>nahida@abc.com</email> <address type="Present Address" title="Student Present Address"> <district>Noakhali</district> <thana>Begum Gonj</thana> <post>3831</post> </address> <fathername>Karim Bapary</fathername> </student> </college> xml; $sxe=simplexml_load_string($xml); echo "<h3>Converting XML to JSON String</h3>"; $str= json_encode($sxe); echo $str; echo "<h3>Converting JSON String to Object</h3>"; echo "<pre>"; print_r(json_decode($str)); echo "</pre>"; echo "<h3>Converting JSON String to Array</h3>"; echo "<pre>"; print_r(json_decode($str,true)); echo "</pre>"; ?>
Output
XML Namespaces কি?
XML এর element গুলোর naming conflict এড়ানোর জন্য যেই পদ্ধতি অবলম্বন করা হয় , তাকে XML Namespaces বলে। আরেকটু ভালো ভাবে বুঝার জন্য নিচের উদাহরণটি দেখুন :
<table> <name>Nahida Sultana</name> <age>20</age> <address>Noakhali, Bangladesh</address> </table> <table> <name>Apple</name> <width>80</width> <length>120</length> </table>
উপরে XML টিতে table নামে দুটি element থাকলেও তাদের Data এর ধরণ সম্পূর্ণ ভিন্ন , তাই স্বাভাবিক ভাবেই এখানে naming Conflict করবে। আর এর জন্য আমরা দুটি table কে দুটি ভিন্ন namespace দিয়ে দিবো। আর namespace দেওয়ার নিয়ম হচ্ছে, প্রথমে আপনার root element এ namespace name কি হবে তা define করা, তারপর প্রতিটা element সেই define করা namespace name কে call করা। নিচে সিনটেক্স এ লক্ষ্য করুন:
<rootElementName xmlns:namespaceName="http://yourNamespaceURL/namespaceName" xmlns:AnotherNamespaceName="http://yourAnotherNamespaceURL/AnotherNamespaceName"> <namespaceName:elementName>Value</namespaceName:elementName> .... .... </rootElementName>
namespace কিভাবে define করতে হয় , তা তো জানলাম , এবার নিচের উদাহরণটি দেখুন:
<info xmlns:student="http://example.org/student" xmlns:fruit="http://example.org/fruit"> <student:table> <student:name>Nahida Sultana</student:name> <student:age>20</student:age> <student:address>Noakhali, Bangladesh</student:address> </student:table> <fruit:table> <fruit:name>Apple</fruit:name> <fruit:width>80</fruit:width> <fruit:length>120</fruit:length> </fruit:table> </info>
https://blog.w3programmers.com/php-course/
কোনো XML এ কি কি namespace ডিক্লেয়ার হয়েছে এবং তাদের URL কি? তা কিভাবে জানা যাবে?
PHP তে কোনো XML এ কি কি namespace ডিক্লেয়ার হয়েছে এবং তাদের URL কি? তা জানতে হলে আপনাকে getDocNamespaces() Method টি ব্যবহার করতে হবে। নিচের উদাহরণ টি দেখুন :
<?php $xml = <<<XML <?xml version="1.0" standalone="yes"?> <info xmlns:student="http://example.org/student" xmlns:fruit="http://example.org/fruit"> <student:table> <student:name>Nahida Sultana</student:name> <student:age>20</student:age> <student:address>Noakhali, Bangladesh</student:address> </student:table> <fruit:table> <fruit:name>Apple</fruit:name> <fruit:width>80</fruit:width> <fruit:length>120</fruit:length> </fruit:table> </info> XML; $sxe = new SimpleXMLElement($xml); $namespaces = $sxe->getDocNamespaces(TRUE); echo "<pre>"; print_r($namespaces); echo "</pre>"; ?>
Output
Array ( [student] => http://example.org/student [fruit] => http://example.org/fruit )
কোনো XML এ কি কি namespace ব্যবহার হয়েছে এবং তাদের URL কি? তা কিভাবে জানা যাবে?
PHP তে কোনো XML এ কি কি namespace ব্যবহার হয়েছে এবং তাদের URL কি? তা জানতে হলে আপনাকে getNamespaces() Method টি ব্যবহার করতে হবে। নিচের উদাহরণ টি দেখুন :
<?php $xml = <<<XML <?xml version="1.0" standalone="yes"?> <info xmlns:student="http://example.org/student" xmlns:fruit="http://example.org/fruit"> <student:table> <student:name>Nahida Sultana</student:name> <student:age>20</student:age> <student:address>Noakhali, Bangladesh</student:address> </student:table> <fruit:table> <fruit:name>Apple</fruit:name> <fruit:width>80</fruit:width> <fruit:length>120</fruit:length> </fruit:table> </info> XML; $sxe = new SimpleXMLElement($xml); $namespaces = $sxe->getNamespaces(true); echo "<pre>"; print_r($namespaces); echo "</pre>"; ?>
Output
Array ( [student] => http://example.org/student [fruit] => http://example.org/fruit )
https://blog.w3programmers.com/php-course/
XML এ xpath কি?
XML এর element এবং attribute গুলোতে সরাসরি access করার সহজ পদ্ধতির নাম হচ্ছে xpath.
PHP তে XML String কে xpath করা যাবে?
অবশ্যই করা যাবে , আর এর জন্য আপনাকে xpath() Method কে ব্যবহার করতে হবে। নিচের উদাহরণটি দেখুন :
<?php $xml = <<<XML <?xml version="1.0"?> <college> <student> <firstname>Nahida</firstname> <lastname>Sultana</lastname> <contact>01722334412</contact> <email>nahida@abc.com</email> <address type="Present Address"> <district>Noakhali</district> <thana>Begum Gonj</thana> <post>3831</post> </address> <fathername>Karim Bapary</fathername> </student> </college> XML; $sxe = new SimpleXMLElement($xml); $address=$sxe->xpath("student/address"); foreach($address as $addr){ foreach($addr as $key=>$val){ echo "$key: $val","<br>"; } } ?>
Output
district: Noakhali thana: Begum Gonj post: 3831
PHP তে XML String এর namespace কে xpath দিয়ে access করা যাবে?
অবশ্যই করা যাবে , আর এর জন্য আপনাকে registerXPathNamespace() Method কে ব্যবহার করতে হবে। নিচের উদাহরণটি দেখুন :
<?php $xml = <<<EOD <book xmlns:chap="http://example.org/chapter-title"> <title>My Book</title> <chapter id="1"> <chap:title>Chapter 1</chap:title> <para>Donec velit. Nullam eget tellus vitae tortor gravida scelerisque. In orci lorem, cursus imperdiet, ultricies non, hendrerit et, orci. Nulla facilisi. Nullam velit nisl, laoreet id, condimentum ut, ultricies id, mauris.</para> </chapter> <chapter id="2"> <chap:title>Chapter 2</chap:title> <para>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Proin gravida. Phasellus tincidunt massa vel urna. Proin adipiscing quam vitae odio. Sed dictum. Ut tincidunt lorem ac lorem. Duis eros tellus, pharetra id, faucibus eu, dapibus dictum, odio.</para> </chapter> </book> EOD; $sxe = new SimpleXMLElement($xml); $sxe->registerXPathNamespace('c', 'http://example.org/chapter-title'); $result = $sxe->xpath('//c:title'); foreach ($result as $title) { echo $title . "\n"; } ?>
Output
Chapter 1 Chapter 2