XML使用PHP DOMDocument为父级插入新的子级

XML使用PHP DOMDocument为父级插入新的子级,php,xml,Php,Xml,如何使用PHP的DOMDocument或DOMDocumentFragment向具有如下结构的XML文件追加内容 <root> <level name="menu1"> <level name="menu1.1"><content name="menu1.1" /></level> <level name="menu1.2"><content name="menu1.2

如何使用PHP的
DOMDocument
DOMDocumentFragment
向具有如下结构的XML文件追加内容

<root>
    <level name="menu1"> 
          <level name="menu1.1"><content name="menu1.1" /></level>
          <level name="menu1.2"><content name="menu1.2" /></level>

          <level name="sub-menu1">
               <level name="sub-menu1.1"><content name="sub-menu1.2"/></level>
          </level>
    </level>

    <level name="menu2"> <!-- Omitted --> 
    </level>
</root>
但是现在如何将
$new\u level\u节点添加到上面的主
XML

对于主XML,我使用以下方法将其读入内存:

$doc = new DOMDocument;
$doc->loadxml( $main_xml );

我觉得文档很清楚,但是如果你是新手,你需要一些耐心和冷静。这些特性对于一个好的程序员(以及想成为程序员的人)来说是必不可少的。不要总是这样

不过,我会举一个例子:

$doc = new DOMDocument;
$doc->preserveWhiteSpace = false;
// Prettify saveXML()
$doc->formatOutput = true;
$doc->load('main.xml');

// Create the child. You don't need to create a new DOMDocument for that
$new_level_node = $doc->createElement('level');
$new_level_node->setAttribute('name','menu1.3');
$new_content_node = $doc->createElement('content');
$new_content_node->setAttribute('name','menu1.3');
$new_level_node->appendChild($new_content_node);

// Now we need to select the menu1 node, in order to call
// appendChild on it. I suggest to use XPath for that.
$xpath_selector = new DOMXPath($doc);

$menu1 = $xpath_selector
    ->query('//level[@name="menu1"]')
    ->item(0);

// Append the new node now
$menu1->appendChild($new_level_node);

// Output the modified document
echo $doc->saveXML();

让我补充一点,当我当时开始学习XML时,对我来说,它也不是一分钟内就完全清楚的。除非我能熟练地使用它,否则这需要一段时间。

顺便说一句,谷歌在你们的地区落后了吗?我希望很多人会同意DOMDocument的文档非常混乱,我可以使用
$root=$doc->documentElement将其添加到根目录中
$root->appendChild($new\u level\u节点)。但是,在特定的位置下添加,例如在父项下添加,并不简单,看起来不错,让我举个例子。如果你从来没有这样做过的话,可能真的很难找到答案。至少你的问题是精心设计的,包含了一个简单的例子和你尝试过的代码。对我们中的一些人来说,编程并不是我们所做的全部。我们可能是需要同时整理硬件的工程师,也可能是需要证明定理的数学教授,也可能是只想编写代码的医生。想象一下,如果你对他们如此光顾。我希望Stack仍然是一个真正的问题可以找到答案的地方,不管问题有多简单。主要贡献者,比如你自己,都会得到奖励。正如我现在将用正确的答案奖励你一样。但是在你离开之前请考虑这个问题:<代码> DOXXPath < /COD>在文档中没有提到过<代码> DoMoists<代码>!代码>和主要贡献者(如您)将获得奖励。
。。嗯,你不是忘了投票吗?
$doc = new DOMDocument;
$doc->loadxml( $main_xml );
$doc = new DOMDocument;
$doc->preserveWhiteSpace = false;
// Prettify saveXML()
$doc->formatOutput = true;
$doc->load('main.xml');

// Create the child. You don't need to create a new DOMDocument for that
$new_level_node = $doc->createElement('level');
$new_level_node->setAttribute('name','menu1.3');
$new_content_node = $doc->createElement('content');
$new_content_node->setAttribute('name','menu1.3');
$new_level_node->appendChild($new_content_node);

// Now we need to select the menu1 node, in order to call
// appendChild on it. I suggest to use XPath for that.
$xpath_selector = new DOMXPath($doc);

$menu1 = $xpath_selector
    ->query('//level[@name="menu1"]')
    ->item(0);

// Append the new node now
$menu1->appendChild($new_level_node);

// Output the modified document
echo $doc->saveXML();