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