尝试克隆 DOMNode 对象 (DOMNode::cloneNode) 时,我在不同环境中运行它时遇到不一致,特别是当我打印 nodeName 属性时克隆无法复制命名空间,例如
$cloneNode = $origNode->cloneNode(true);
echo("old node name = " . $origNode->nodeName);
echo("new node name = " . $cloneNode->nodeName);
结果(本地-mac os)
“旧节点名称=命名空间:Hello”
“新节点名称=命名空间:Hello”
结果(本地 - centos):
“旧节点名称=命名空间:Hello”
“新节点名称=Hello”
在对节点进行任何操作之前,我使用 DOMXPath::registerNamespace 注册名称空间。
更新
我发现有问题的行 ($origNode->parentNode->removeChild( $origNode );) 删除后会导致克隆按预期工作,无论如何。然而,保持所述线仍然会在不同环境中产生不同的结果。一个例子:
<?php
$string = '<?xml version="1.0" encoding="UTF-8"?>
<ns:Root xmlns:ns="http://google.com/">
<ns:Hello>
<ns:World/>
</ns:Hello>
</ns:Root>';
$dom = new \DOMDocument();
$dom->loadXML($string);
$xpath = new \DOMXPath($dom);
$rootNamespace = $dom->documentElement->lookupNamespaceUri('ns');
$xpath->registerNamespace('ns', $rootNamespace);
$parentNode = $xpath->query('//ns:Hello')->item( 0 );
$origNode = $xpath->query('//ns:World')->item( 0 );
$origNode->parentNode->removeChild($origNode);
$newNode = $origNode->cloneNode( true );
echo("old node name = " . $origNode->nodeName) . PHP_EOL;
echo("new node name = " . $newNode->nodeName) . PHP_EOL;
?>