2017-03-07 6 views
1

Dies ist ein Beispiel meiner XML-Dokument, das eine Website SitemapHinzufügen neuer Knoten und seine untergeordneten Knoten XML-Dokument DOMDocument mit

<?xml version="1.0" encoding="UTF-8"?> 
<project name="Esurance 365 Portal"> 
    <elements> 
     <element name="folderone" path="forms/folderone"> 
      <folder function="model">models</folder> 
      <folder function="controller">controllers</folder> 
      <folder function="view">views</folder> 
     </element> 
    </elements> 
</project> 

zeigt würde Ich mag DOMDocument verwenden ein anderes Element Knoten über dem eine dargestellt hinzufügen so dass es scheint, als

<?xml version="1.0" encoding="UTF-8"?> 
    <project name="Esurance 365 Portal"> 
     <elements> 
      <element name="foldertwo" path="forms/foldertwo"> 
       <folder function="model">modelstwo</folder> 
       <folder function="controller">controllerstwo</folder> 
       <folder function="view">viewstwo</folder> 
      </element> 
      <element name="folderone" path="forms/folderone"> 
       <folder function="model">models</folder> 
       <folder function="controller">controllers</folder> 
       <folder function="view">views</folder> 
      </element> 
     </elements> 
    </project> 

Aber aus der DOMDocument Dokumentation folgt kippe ich scheine auch ein Beispiel zu finden, die mir zeigt, wie das neue Element erreicht werden würde.

Die Methoden createElement und appendChild zeigen mir nur, wie Sie den Elementknoten einfügen, aber nicht, wie Sie die verbleibenden Kindknoten des Ordners einfügen.

+0

Ergebnis Siehe diese Funktionen verwenden Sie auf, dass ein neues DOM-Knoten/Element wieder sollten Sie appendChild wieder aufrufen können. –

Antwort

1

Wählen Sie element und kopieren Sie es mit cloneNode(). Setzen Sie unter Verwendung von setAttribute() den neuen Wert des Attributs und verwenden Sie nodeValue, um einen neuen Text im Ziel-Tag festzulegen. Fügen Sie am Ende des Codes ein neues Element vor dem vorhandenen Element ein, indem Sie insertBefore() verwenden.

$dom = new DOMDocument(); 
$dom->loadXml($xml); 
// select "element" tag and copy it 
$element = $dom->getElementsByTagName("element")->item(0); 
$clone = $element->cloneNode(true); 
// change value of attribute 
$clone->setAttribute("name", "foldertwo"); 
$clone->setAttribute("path", "forms/foldertwo"); 
// select "folder" tag in new "element" tag change text of them 
$folder = $clone->getElementsByTagName("folder"); 
$folder->item(0)->nodeValue = "modelstwo"; 
$folder->item(1)->nodeValue = "controllerstwo"; 
$folder->item(2)->nodeValue = "viewstwo"; 
// insert new elements before existing element. 
$element->parentNode->insertBefore($clone, $element); 
$xml = $dom->saveXml(); 

in demo

+0

Es macht den Trick ;-) aber ich hätte auch gerne einen bekommen, der den Knoten direkt erstellen kann, ohne einen vorhandenen klonen zu müssen. –

+0

Siehe https://3v4l.org/60mXo – Mohammad

Verwandte Themen