I’m trying to modify a XML file. I tried same code with an more basic XML file and it worked perfectly. But when I use the same code for some other XML file with changing the path, I am getting this:
Notice: Indirect modification of overloaded element of DOMNodeList has no effect in /storage/ssd2/119/18719119/public_html/pages/create_config/index.php on line 19 Warning: Creating default object from empty value in /storage/ssd2/119/18719119/public_html/pages/create_config/index.php on line 19 Fatal error: Uncaught Error: Call to a member function appendChild() on null in /storage/ssd2/119/18719119/public_html/pages/create_config/index.php:25 Stack trace: #0 {main} thrown in /storage/ssd2/119/18719119/public_html/pages/create_config/index.php on line 25
This is the XML file: (I sign the line I want to change for example)
<?xml version="1.0" encoding="UTF-8"?> <config xmlns="http://www.linphone.org/xsds/lpconfig.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.linphone.org/xsds/lpconfig.xsd lpconfig.xsd"> <section name="sip"> <entry name="default_proxy" overwrite="true">0</entry> </section> <section name="net"> <entry name="nat_policy_ref" overwrite="true">~OuCpkaPzCwyvMo</entry> </section> <section name="misc"> <entry name="transient_provisioning" overwrite="true">1</entry> </section> <section name="nat_policy_default_values"> <entry name="stun_server">stun.linphone.org</entry> <entry name="protocols">stun,ice</entry> </section> <section name="nat_policy_0"> <entry name="ref" overwrite="true">~OuCpkaPzCwyvMo</entry> <entry name="stun_server" overwrite="true">stun.linphone.org</entry> <entry name="protocols" overwrite="true">stun,ice</entry> </section> <section name="auth_info_0" overwrite="true"> <entry name="username" overwrite="true">bilbo.baggins</entry><!-- I WANT TO CHANGE THE "bilbo.baggins" TEXT IN HERE --> <entry name="ha1" overwrite="true">7f37aeccfad9855e4584c5465d6b4638</entry> <entry name="realm" overwrite="true">sip.linphone.org</entry> <entry name="domain" overwrite="true">sip.linphone.org</entry> <entry name="algorithm" overwrite="true">MD5</entry> </section> <section name="proxy_0" overwrite="true"> <entry name="reg_proxy" overwrite="true"><sip:sip.linphone.org;transport=tls></entry> <entry name="reg_route" overwrite="true"><sip:sip.linphone.org;transport=tls></entry> <entry name="reg_identity" overwrite="true">"Bilbo Baggins" <sip:bilbo.baggins@sip.linphone.org></entry> <entry name="realm" overwrite="true">sip.linphone.org</entry> <entry name="quality_reporting_collector" overwrite="true">sip:voip-metrics@sip.linphone.org;transport=tls</entry> <entry name="quality_reporting_enabled" overwrite="true">1</entry> <entry name="quality_reporting_interval" overwrite="true">180</entry> <entry name="reg_expires" overwrite="true">31536000</entry> <entry name="reg_sendregister" overwrite="true">1</entry> <entry name="publish" overwrite="true">1</entry> <entry name="avpf" overwrite="true">1</entry> <entry name="avpf_rr_interval" overwrite="true">1</entry> <entry name="nat_policy_ref" overwrite="true">~OuCpkaPzCwyvMo</entry> </section> </config>
So I use the code piece below:
<?php if(isset($_REQUEST['Create'])){ $var = $_POST["name"]; $xml = file_get_contents("remote_prov2isioning.xml"); $dom = new DomDocument(); $dom->loadXml($xml); $xpath = new DomXpath($dom); // find the data element with the matching attribute $node = $xpath->query("/config[@xmlns='http://www.linphone.org/xsds/lpconfig.xsd']/section[@name='auth_info_0']/entry[@name='username']"); // assume there's only one, otherwise we can loop // clear the existing content $node[0]->textContent = ""; //<--- line 19 // create a new string $fragment = $dom->createDocumentFragment(); $fragment->appendXML($var); $node[0]->appendChild($fragment); //<--- line 25 // save the updated XML file_put_contents("remote_prov2isioning.xml", $dom->saveXml()); } ?>
I thought maybe the problem is about me, writing the path wrong but I check it couple of times and couldn’t see anything wrong. I’m totally stuck. Thanks for any idea/comment..
Advertisement
Answer
You need to account for namespaces in order to access the right element. Something like:
$xpath = new DOMXPath($dom); $xpath->registerNamespace("xx", "http://www.linphone.org/xsds/lpconfig.xsd"); $target = $xpath->query("//xx:section[@name='auth_info_0']/xx:entry[@name='username']"); $target[0]->nodeValue = "john.doe"; echo $XMLDoc->saveXML($XMLDoc);
and you should see your expected output.