PHP XML节点处理

PHP XML节点处理,php,xml,xml-parsing,Php,Xml,Xml Parsing,我现在真的很沮丧,因为我似乎不明白为什么将一个节点(包含所有子节点)从一个XML树复制到另一个XML树如此困难 我在谷歌上搜索了很多,似乎我必须用SimpleXML读入这些树,然后将节点解析到DOM中,以某种方式导入/导出它们。 是否应该有一个功能一次性完成这项工作 基本上我想从源代码复制所有processList->process条目到目标测试->processList-> source: <processList> <process ...>

我现在真的很沮丧,因为我似乎不明白为什么将一个节点(包含所有子节点)从一个XML树复制到另一个XML树如此困难

我在谷歌上搜索了很多,似乎我必须用SimpleXML读入这些树,然后将节点解析到DOM中,以某种方式导入/导出它们。 是否应该有一个功能一次性完成这项工作

基本上我想从源代码复制所有processList->process条目到目标测试->processList->

source:
<processList>
    <process ...>
        //some more child nodes
    </process>
</processList>

destination:
<test>
    <processList>
        <process ...>
            //some more child nodes
        </process>
    </processList>
</test>
来源:
//还有一些子节点
目的地:
//还有一些子节点

有人能提供建议吗?

DOM可以轻松做到这一点
DOMDocument::importNode()
允许从其他文档导入节点。导入的节点可以像任何节点一样附加/插入

DOMXpath::evaluate()
可用于从DOM获取节点

$sourceXml = <<<'XML'
<processList>
  <process from="source">
    //some more child nodes
  </process>
</processList>
XML;    
$targetXml = <<<'XML'
<test>
  <processList>
    <process from="target">
      //some more child nodes
    </process>
  </processList>
</test>
XML;

$source = new DOMDocument();
$source->loadXml($sourceXml);
$sourceXpath = new DOMXPath($source);

$target = new DOMDocument();
$target->preserveWhiteSpace = false;
$target->formatOutput = true;
$target->loadXml($targetXml);
$targetXpath = new DOMXPath($target);

$targetNode = $targetXpath->evaluate('//processList[1]')->item(0);    
foreach ($sourceXpath->evaluate('//process') as $process) {
  $targetNode->appendChild(
    // import the node into the target document
    $target->importNode($process, TRUE)
  );
}    
echo $target->saveXml();
$sourceXml=项(0);
foreach($sourceXpath->evaluate('//process')为$process){
$targetNode->appendChild(
//将节点导入到目标文档中
$target->importNode($process,TRUE)
);
}    
echo$target->saveXml();
输出:

<?xml version="1.0"?>
<test>
  <processList>
    <process from="target">
      //some more child nodes
    </process>
    <process from="source">
    //some more child nodes
  </process>
  </processList>
</test>

//还有一些子节点
//还有一些子节点

谢谢你的回答!然而,我仍然没有看到一个参考。在这种情况下,目标不应是输出。所以我想要实现的是将流程条目从源复制到目标的流程条目旁边。换句话说,我将这两个树作为SimpleXML读入,并希望将流程节点从源复制到目标SimpleXML是DOM之上的一个抽象,它没有节点,也没有只包含文档的SimpleXMLElement对象。这意味着它相当有限,不能在文档之间复制节点。您需要直接使用DOMAPI。好吧,这样更有意义,但simpleXMLelements仍然包含内容本身吗?如果我回显json_编码,我可以看到内容。所以从理论上说,搬家应该没问题吧?不过,我接受你的回答,并感谢快速解决方案。了解它的工作原理非常有帮助!不,JSON编码的SimpleXML对象并不总是包含来自原始XML的所有数据。仅适用于特定和简单的文档。