如何通过php dom在xml上的特定节点中添加新节点

如何通过php dom在xml上的特定节点中添加新节点

问题描述:

I want to insert new node to specific node but I have no idea how to do it

number.xml

<numbers>
   <number>1</number>
   <number>2</number>
   <number>3</number>
   <number>4</number>
   <number>5</number>
</numbers>

number.php

<?php
$xml = new DOMDocument();
$xml->formatOutput=true;
$xml -> load('number.xml');
$xml_subnumber = $xml->createElement("subNumber");
$xml_subnumber_text = $xml->createTextNode("3.3");
$xml_subnumber->appendChild($xml_subnumber_text);
//something here (I have no idea.)
$xml->save("number.xml") or die("Error");
?>

and I want the xml file seem like this...

<numbers>
   <number>1</number>
   <number>2</number>
   <number>3
     <subNumber>3.3</subNumber>
   </number>
   <number>4</number>
   <number>5</number>
</numbers>

我想将新节点插入特定节点,但我不知道如何操作 p>

number.xml p>

 &lt; numbers&gt; 
&lt; number&gt; 1&lt; / number&gt; 
&lt; number&gt; 2&lt; / number&gt; 
  &lt; number&gt; 3&lt; / number&gt; 
&lt; number&gt; 4&lt; / number&gt; 
&lt; number&gt; 5&lt; / number&gt; 
&lt; / numbers&gt; 
  code>  pre> 
 \  n 

number.php p>

 &lt;?php 
 $ xml = new DOMDocument(); 
 $ xml-&gt; formatOutput = true; 
 $ xml  - &GT;  load('number.xml'); 
 $ xml_subnumber = $ xml-&gt; createElement(“subNumber”); 
 $ xml_subnumber_text = $ xml-&gt; createTextNode(“3.3”); 
 $ xml_subnumber-&gt;  appendChild($ xml_subnumber_text); 
 //这里的东西(我不知道。)
 $ xml-&gt; save(“number.xml”)或die(“Error”); 
?&gt; 
   pre> 
 
 

我希望xml文件看起来像这样...... p>

 &lt; numbers&gt; 
&lt; number&gt;  1&lt; / number&gt; 
&lt; number&gt; 2&lt; / number&gt; 
&lt; number&gt; 3 
&lt; subNumber&gt; 3.3&lt; / subNumber&gt; 
&lt; / number&gt; 
&lt; number&gt; 4&lt;  / number&gt; 
&lt; number&gt; 5&lt; / number&gt; 
&lt; / numbers&gt; 
  code>  pre> 
  div>

You need to find the number element node and append the new node to it. Here is XPath for that. /numbers/number[3] will return the third number element node. It will return it in a list, because expressions could return several nodes or no nodes. This way the result type always stays the same.

$xml = new DOMDocument();
$xml->formatOutput = true;
$xml->preserveWhiteSpace = false;

$xml->loadXml(
  '<numbers>
   <number>1</number>
   <number>2</number>
   <number>3</number>
   <number>4</number>
   <number>5</number>
  </numbers>'
);
$xpath = new DOMXpath($xml);

foreach ($xpath->evaluate('/numbers/number[3]') as $thirdNumber) {
  $subNumber = $thirdNumber->appendChild(
     $xml->createElement("subNumber")
  );
  $subNumber->appendChild($xml->createTextNode("3.3"));
}

echo $xml->saveXml();

Output:

<?xml version="1.0"?>
<numbers>
   <number>1</number>
   <number>2</number>
   <number>3<subNumber>3.3</subNumber></number>
   <number>4</number>
   <number>5</number>
</numbers>