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"

結果 (local - 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 に答える