cloneNode与命名空间不一致 - 交叉环境?

时间:2013-06-06 12:24:39

标签: php dom xpath

当尝试克隆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;

?>

1 个答案:

答案 0 :(得分:1)

已解决 - 不同的行为是不同版本的libxml(20706 vs 20708)的结果。将centos框更新为20708后,命名空间保持不变。