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 第二行是<books/>
而不是<books>
@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
对象中,而不是创建一个新对象。
这不会创建一个新的文档对象,它只是将它附加到文档中的正确位置。您将它附加到根,但它需要附加到 <books>
元素。
好的。如果你可以帮助我如何将它保存到 XML,因为$documentBooks
只是一个 DOM 元素,但我需要使用$document->saveXML()
保存最终的 DOM 文档@
应该可以的。 $documentBooks
是对 $document
的子代的引用。
$documentBooks = $document->documentElement;
是一个更好(更具体)的选项。以上是关于PHP DOM 将子元素附加到根的主要内容,如果未能解决你的问题,请参考以下文章
Jsoup:将子 <input> 元素附加到 <foorm> 不会影响表单数据