Rename an XML node using PHP -
i'm trying figure out how rename node in xml using php?
i have come far:
$dom = new domdocument( '1.0' ); $dom->preservewhitespace = false; $dom->formatoutput = true; // load xml file $dom->loadxml( '<?xml version="1.0" encoding="iso-8859-1"?> <library> <data> <invite> <username>jmansa</username> <userid>1</userid> </invite> <update>1</update> </data> </library>', libxml_noblanks ); $xpath = new domxpath($dom); //find 'data' nodes. $node = $xpath->query("//data"); // if found if( $node->length ) { foreach ($node $n) { // rename here? // } } echo "<xmp>". $dom->savexml() ."</xmp>";
now, want rename <data>
<invites>
. can done , if yes, how?
a node's name ("data" or "invites" respectively) cannot renamed via dom because node::nodename property read-only.
you can create new node named "invites", append before "data" node, move children of "data" new "invites" node, remove "data" node, , output tree result.
example:
<?php // create test document. $dom = new domdocument( '1.0' ); $dom->preservewhitespace = false; $dom->formatoutput = true; // load xml file. $dom->loadxml('<?xml version="1.0" encoding="iso-8859-1"?'.'> <library> <data attr1="1" attr2="2"> <invite> <username>jmansa</username> <userid>1</userid> </invite> <update>1</update> </data> </library>', libxml_noblanks ); $xpath = new domxpath($dom); // convert <data> <invites>. if ($datanode = $xpath->query("/library/data")->item(0)) { // create <invites> node. $invitesnode = $dom->createelement('invites'); $dataattrs = $datanode->attributes; foreach ($dataattrs $dataattr) { $invitesnode->setattributenodens($dataattr->clonenode()); } $dom->documentelement->appendchild($invitesnode); // move <data> children over. if ($childnodes = $xpath->query("/library/data/*")) { foreach ($childnodes $childnode) { $invitesnode->appendchild($childnode); } } // remove <data>. $datanode->parentnode->removechild($datanode); } // test result. echo $dom->savexml(); ?>
Comments
Post a Comment