Добавление нового узла и его дочерних узлов в документ XML с использованием DOMDocument

Это образец моего XML-документа, который показывает карту сайта

<?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>

Я хотел бы использовать DOMDocument добавить еще один узел элемента над изображенным, чтобы он выглядел следующим образом

<?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>

Но из DOMDocument документация, которую я не могу найти даже в примере, который показывает мне, как новый элемент будет достигнут.

createElement а также appendChild методы показывают только, как вставить узел элемента, но не как вставить оставшиеся дочерние узлы папки.

1

Решение

Выбрать element пометить и использовать cloneNode() копировать это. С помощью setAttribute() установить новое значение атрибута и используя nodeValue установить новый текст в целевой тег. В конце кода вставьте новый элемент перед существующим элементом, используя insertBefore().

$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();

Смотрите результат в демонстрация

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector