【问题标题】:PHP DOM appendeing children elements to rootPHP DOM 将子元素附加到根
【发布时间】: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 起初是空的。正如我所说,漫长的一天......

标签: php xml dom


【解决方案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; 是一个更好(更具体)的选项。
猜你喜欢
  • 2014-03-10
  • 2016-07-24
  • 1970-01-01
  • 2019-05-24
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
相关资源
最近更新 更多