Yeah.. Finally, I came back to my blog.. I was too much busy with new my job. Recently I switched to a new software company named: Codemate Bangladesh Ltd. So, I was a bit busy for last fews day that I couldn’t get the time to give any post here. Now I feel that I should share something new. Well… Recently, I had to work on a large document management application in my new office where I have worked on lots of XML documents. Then I decide I will give a post that describes some easy tricks to search in XML and replace a node. Let start the tutorial..
PHP has very nice library named SimpleXML library though it has some limitations But you can use it for adding new and search node. Basically it converts the whole xml in the object. To replace something definitely you will have to search the node first. Suppose we have XML string data like this:
$data = "<xml> <address_book> <name>Mr. X </name> <mobile number = '01712722876' /> <email>[email protected]</email> </address_book> <address_book> <name>Mr. Y </name> <mobile number = '0171222876' /> <email>[email protected]</email> </address_book> </xml>";
Convert the data in SimpleXml
$xml = new SimpleXml ($data);
Now you want to find the node: ‘mobile’ and want to add the type of number as test to it this node with keeping untouched the attribute.
$mobileNumberNodes = $xml->xpath('//mobile');
You will get the all node objects of mobile. Now iterate all nodes
if ($mobileNumberNodes) { foreach($mobileNumberNodes AS $mobileNumberNode) { //Keep the reference of parent node $parentNodeOfMobileNumberNode = $mobileNumberNode->xpath( 'parent::*' ); $attributes = $mobileNumberNode->attributes(); //remove the node. removeNode is a custom function that I wrote.. removeSimpleXmlNode($mobileNumberNode); $node = $parentNodeOfMobileNumberNode[0]->addChild('mobile', 'Office'); $node->addAttribute('number', (String) $attributes[0]); } }
This is a simple custom function. Actually, I have already told that SimpleXml library has some limitations. There is no function in SimpleXml library to remove a node. So, I have to import the node to Dom. Then, it’s to easy to remove the node.
/** * The PHP SimpleXML library doesn't have any node remove function. So this function helps to remove the node * * @param $node */ function removeSimpleXmlNode($node) { $dom = dom_import_simplexml($node); $dom->parentNode->removeChild($dom); }
Now take a look at modified xml.
echo $xml->asXML();
Output:
<xml> <address_book> <name>Mr. X </name> <mobile number = '01712722876' > Office </mobile> <email>[email protected]</email> </address_boo k> <address_book> <name>Mr. Y </name> <mobile number = '0171222876' > Office </mobile> <email>xyz@yahoo.com</email> </address_book> </xml>
You can even do the whole thing by PHP Dom.