将 DOMDocument 根元素附加到另一个 DOMDocument

Tam*_*ara 1 php xml domdocument

我有 2 个“DOMDocument”对象 - $original 和 $additional。我想要的是从 $additional DOMDocument 中取出所有孩子并将其附加到 $original 文档的末尾。

我的计划是获取 $additional 文档的根元素。我尝试使用:

$root = $additional->documentElement;
$original->appendChild($root)
Run Code Online (Sandbox Code Playgroud)

但是我收到 appendChild 期望 DOMNode 对象作为参数的错误。我尝试通过以下方式访问文档的每个子项:

$additional->childNodes->item(0);
Run Code Online (Sandbox Code Playgroud)

但它返回 DOMElement 的对象。你能建议如何获取 DOMNode 类的对象吗?提供此导入操作的最方便的方法是什么?

$original XML 看起来像:

<?xml version="1.0" encoding="utf-8"?>
<Product>
     <RecordReference>345345</RecordReference>
     <NotificationType>03</NotificationType>
     <NumberOfPages>100</NumberOfPages 
</Product>
Run Code Online (Sandbox Code Playgroud)

$additional XML 看起来像:

<?xml version="1.0" encoding="utf-8"?>
<MainSubject>
    <SubjectScheme>10</SubjectScheme>
</MainSubject>
Run Code Online (Sandbox Code Playgroud)

我想要的:

<?xml version="1.0" encoding="utf-8"?>
<Product>
     <RecordReference>345345</RecordReference>
     <NotificationType>03</NotificationType>
     <NumberOfPages>100</NumberOfPages>
     <MainSubject>
         <SubjectScheme>10</SubjectScheme>
     </MainSubject> 
</Product>
Run Code Online (Sandbox Code Playgroud)

ThW*_*ThW 5

DOMElement 是 DOMNode,DOMNode 是超类。下面是元素、文本和其他节点的几个子类。只需迭代、导入和附加它们。

$targetDom = new DOMDocument();
$targetDom->loadXML('<root/>');

$sourceDom = new DOMDocument();
$sourceDom->loadXml('<items><child/>TEXT</items>');

foreach ($sourceDom->documentElement->childNodes as $child) {
  $targetDom->documentElement->appendChild(
    $targetDom->importNode($child, TRUE)
  );
}
Run Code Online (Sandbox Code Playgroud)

这也适用于文档元素。

$targetDom = new DOMDocument();
$targetDom->loadXML('<root/>');

$sourceDom = new DOMDocument();
$sourceDom->loadXml('<items><child/>TEXT</items>');

$targetDom->documentElement->appendChild(
  $targetDom->importNode($sourceDom->documentElement, TRUE)
);

echo $targetDom->saveXml();
Run Code Online (Sandbox Code Playgroud)

DOMDocument::importNode()在文档的上下文中创建所提供节点的副本。只有属于文档的节点才能附加到它。

  • @Tamara 您只需要消除 foreach 外观并附加导入源节点的文档元素的子项。`$targetDom-&gt;documentElement-&gt;appendChild($targetDom-&gt;importNode($sourceDom-&gt;documentElement, true));` (3认同)
  • @Tamara 因为文档是用元数据(例如版本和编码)实例化的。在目标节点上调用 `importNode` 可确保内容在被导入的节点上具有兼容的元数据。 (2认同)