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

问题描述 投票:5回答:1

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

结果(本地 - centos): “old node name = namespace:Hello” “新节点名称= Hello”

在对节点执行任何操作之前,我使用DOMXPath :: registerNamespace注册命名空间。

Update

我发现了违规行($ 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;

?>
php dom xpath
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.