5

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

?>
4

1 回答 1

1

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

于 2013-06-20T13:20:53.840 回答