Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP XML How to create Nested Node?

Tags:

php

xml

I use php DOMDocument to create and save XML file. here is my code

$doc = new DOMDocument();
$document = $doc->createElement('DOCUMENT');
$document->nodeValue = '';
$doc->appendChild($document);

$order = $doc->createElement('ORDER');
$order->nodeValue = '';
$doc->appendChild($order);

$ele = $doc->createElement('Reportvariable1');
$ele->nodeValue = '';
$doc->appendChild($ele);

$ele = $doc->createElement('Reportvariable1');
$ele->nodeValue = '';
$doc->appendChild($ele);

$ele = $doc->createElement('Reportvariable1');
$ele->nodeValue = '';
$doc->appendChild($ele);

$ele = $doc->createElement('Reportvariable1');
$ele->nodeValue = '';
$doc->appendChild($ele);

$doc->appendChild($ele);
$doc->save('order_xml/Order_.xml');

its Output is simple like this :

<?xml version="1.0"?>
<DOCUMENT></DOCUMENT>
<ORDER></ORDER>
<Reportvariable1></Reportvariable1>
<Reportvariable1></Reportvariable1>
<Reportvariable1></Reportvariable1>
<Reportvariable1></Reportvariable1>

How do I create nested nodes like this ?

<?xml version="1.0"?>
<DOCUMENT>
    <ORDER>
       <Reportvariable1></Reportvariable1>
       <Reportvariable1></Reportvariable1>
       <Reportvariable1></Reportvariable1>
       <Reportvariable1></Reportvariable1>
   </ORDER>
</DOCUMENT>
like image 340
Shivam Pandya Avatar asked Sep 28 '26 09:09

Shivam Pandya


2 Answers

You use 3 steps to add a new node to the DOM.

  1. Create the node using a method of the document object
  2. Append the node using appendChild() to the parent (document or element)
  3. Optionally set attributes on the element node.

appendChild() returns the node. So you can nest the create* call.

Don't set DOMElement::$nodeValue. It has a non standard behaviour and needs special escaping. Use the DOMElement::$textContent property. Or create a text node and append it.

$dom = new DOMDocument();
$document = $dom->appendChild(
  $dom->createElement('DOCUMENT')
);
$order = $document->appendChild(
  $dom->createElement('ORDER')
);
// 3 nodes setting text content 
for ($i = 1; $i <= 3; $i++) {
  $order
    ->appendChild(
      $dom->createElement('Reportvariable1')
    )
    ->textContent = 'some text content' . $i;
}
// 3 nodes appending a text node
for ($i = 3; $i <= 6; $i++) {
  $order
    ->appendChild(
      $dom->createElement('Reportvariable1')
    )
    ->appendChild(
      $dom->createTextNode('some text content' . $i)
   );
}
$dom->formatOutput = true;
echo $dom->saveXml();

Output:

<?xml version="1.0"?>
<DOCUMENT>
  <ORDER>
    <Reportvariable1>some text content1</Reportvariable1>
    <Reportvariable1>some text content2</Reportvariable1>
    <Reportvariable1>some text content3</Reportvariable1>
    <Reportvariable1>some text content4</Reportvariable1>
    <Reportvariable1>some text content5</Reportvariable1>
    <Reportvariable1>some text content6</Reportvariable1>
  </ORDER>
</DOCUMENT>
like image 59
ThW Avatar answered Sep 29 '26 21:09

ThW


Change your code to:-

$doc = new DOMDocument();
    $document = $doc->createElement('DOCUMENT');$document->nodeValue = '';$doc->appendChild($document);
    $order = $doc->createElement('ORDER');$order->nodeValue = '';$document->appendChild($order);

    $ele = $doc->createElement('Reportvariable1');$ele->nodeValue = '';$order->appendChild($ele);
    $ele = $doc->createElement('Reportvariable1');$ele->nodeValue = '';$order->appendChild($ele);
    $ele = $doc->createElement('Reportvariable1');$ele->nodeValue = '';$order->appendChild($ele);
    $ele = $doc->createElement('Reportvariable1');$ele->nodeValue = '';$order->appendChild($ele);
    $doc->save('order_xml/Order_.xml');

You will get the desired output

like image 22
Webdev Avatar answered Sep 29 '26 21:09

Webdev



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!