当尝试克隆DOMNode对象(DOMNode :: cloneNode)时,我遇到了在不同环境中运行它的不一致性,特别是当我打印nodeName属性时克隆无法复制命名空间,例如。
$cloneNode = $origNode->cloneNode(true);
echo("old node name = " . $origNode->nodeName);
echo("new node name = " . $cloneNode->nodeName);
结果(本地 - mac os)
“old node name = namespace:Hello”
“new node name = namespace:Hello”
结果(本地 - 中心):
“old node name = namespace: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;
?>
答案 0 :(得分:1)
已解决 - 不同的行为是不同版本的libxml(20706 vs 20708)的结果。将centos框更新为20708后,命名空间保持不变。