PHP XML Part-2

php xml
php xml

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

XML from XML
XML from 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("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

Show Attribute name and Value using PHP Simple XML
Show Attribute name and Value using PHP Simple XML

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

Convert XML to JSON String
Convert XML to JSON String
Convert JSON String to Array
Convert JSON String to Array
Convert JSON String To Object
Convert JSON String To Object

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

আমি মাসুদ আলম, বাংলাদেশের ৩৬ তম Zend Certified Engineer । ২০০৯ সালে কম্পিউটার সাইন্স থেকে বেচেলর ডিগ্রী অর্জন করি। দীর্ঘ ১৫ বছর আমি Winux Soft, SSL Wireless, IBCS-PRIMAX, Max Group, Canadian International Development Agency (CIDA), Care Bangladesh, World Vision, Hellen Keller, Amarbebsha Ltd সহ বিভিন্ন দেশি বিদেশী কোম্পানিতে ডেটা সাইন্স, মেশিন লার্নিং, বিগ ডেটা, ওয়েব ডেভেলপমেন্ট এবং সফটওয়্যার ডেভেলপমেন্ট এর উপর বিভিন্ন লিডিং পজিশন এ চাকরি এবং প্রজেক্ট লিড করি। এছাড়াও বাংলাদেশের ১৮৫ জন জেন্ড সার্টিফাইড ইঞ্জিনিয়ার এর মধ্যে ১২০ এরও অধিক ছাত্র আমার হাতে জেন্ড সার্টিফাইড ইঞ্জিনিয়ার হয়েছেন। বর্তমানে w3programmers ট্রেনিং ইনস্টিটিউট এ PHP এর উপর Professional এবং Advance Zend Certified PHP -8.2 Engineering, Laravel Mastering Course with ReactJS, Python Beginning To Advance with Blockchain, Machine Learning and Data Science, Professional WordPress Plugin Development Beginning to Advance কোর্স করাই। আর অবসর সময়ে w3programmers.com এ ওয়েব টেকনোলজি নিয়ে লেখালেখি করি।

Leave a Reply