PHP DOM 将子元素附加到根

Posted

技术标签:

【中文标题】PHP DOM 将子元素附加到根【英文标题】:PHP DOM appendeing children elements to root 【发布时间】:2020-11-10 04:55:50 【问题描述】:

我正在尝试将子元素附加到预加载的根元素,如下所示

    $document = new DOMDocument('1.0', 'UTF-8');
    $document->loadXML('<books></books>');


    $content = '<books>
                   <book>
                       <athors>
                           <athor>
                               <name>John Doe</name>
                           </athor>
                       </athors>
                   </book>
               </books>';
     
    $books = new DOMDocument()

    $books->loadXML($content);

    foreach ($books as $book)
        $document->appendChild($document->importNode( $book, true ));
    

由于某种原因,结果 xml 文档将如下所示,根元素的结束标记位于文档的开头:

   <?xml version="1.0"?>
   <books/>
         <book>
                       <athors>
                           <athor>
                               <name>John Doe</name>
                           </athor>
                       </athors>
          </book>

我希望它如下所示:

   <?xml version="1.0"?>
   <books>
         <book>
                       <athors>
                           <athor>
                               <name>John Doe</name>
                           </athor>
                       </athors>
          </book>
   <books/>

【问题讨论】:

你到底想追加什么?之前和之后看起来一样。 @JackFleeting 第二行是&lt;books/&gt; 而不是&lt;books&gt; @Barmar 据我所知,$content 和预期输出的结构都是books/book/authors/author/name;但话说回来,这已经是漫长的一天了...... 但是他得到的输出不是那个结构。他正在尝试将$content 合并到$document @Barmar 知道了; $document 起初是空的。正如我所说,漫长的一天...... 【参考方案1】:

您正在迭代 $books 中根元素的子元素,而不是 book 元素。然后您将附加到 $document 的根,而不是 books 元素。

您需要深入每个节点以到达适当的节点。

<?php
$document = new DOMDocument('1.0', 'UTF-8');
$document->loadXML('<books></books>');
$documentBooks = $document->childNodes[0];

$content = '<books>
                   <book>
                       <athors>
                           <athor>
                               <name>John Doe</name>
                           </athor>
                       </athors>
                   </book>
               </books>';
     
$books = new DOMDocument();
$books->loadXML($content);
$bookItems = $books->childNodes[0]->childNodes;

foreach ($bookItems as $book)
    $documentBooks->appendChild($document->importNode( $book, true ));

echo $document->saveXML();

【讨论】:

谢谢,但我试图将其附加到初始 $document 对象中,而不是创建一个新对象。 这不会创建一个新的文档对象,它只是将它附加到文档中的正确位置。您将它附加到根,但它需要附加到 &lt;books&gt; 元素。 好的。如果你可以帮助我如何将它保存到 XML,因为$documentBooks 只是一个 DOM 元素,但我需要使用$document-&gt;saveXML()保存最终的 DOM 文档@ 应该可以的。 $documentBooks 是对 $document 的子代的引用。 $documentBooks = $document-&gt;documentElement; 是一个更好(更具体)的选项。

以上是关于PHP DOM 将子元素附加到根的主要内容,如果未能解决你的问题,请参考以下文章

Jsoup:将子 <input> 元素附加到 <foorm> 不会影响表单数据

PHP HTML DOM Parse - 找不到附加的javascript元素

DOM属性操作中CRUD操作

php 创建 DOM 元素并使用 ajax 发送

如何将 DOM 元素附加到动态新添加的 DOM 元素

将多个元素附加到 DOM 的 jquery 会丢失排序顺序