XPathとDOMDocumentを使用して2つのXMLドキュメントをマージするときのエラー

dom domdocument php xml xpath
XPathとDOMDocumentを使用して2つのXMLドキュメントをマージするときのエラー

約1年前、PHPのXPathとDOMDocumentを使用してDOMを操作できるjQueryにヒントを得たライブラリを作成しました。 私は最近、それを整理して、オープンソースプロジェクトとして投稿したかった。 私は過去数日間、改善を行い、PHPのネイティブOO機能のいくつかを実装してきました。

とにかく、別のXMLドキュメントを現在のXMLドキュメントにマージできる新しいメソッドを追加すると思いました。 ここでのキャッチは、このメソッドが2つのXPath式を要求することです。 最初のものは、既存のドキュメントにマージする要素を取得します。 2番目は、これらのマージされた要素の宛先パスを指定します。

このメソッドは、両方のパスから一致する要素を取得するのにうまく機能しますが、現在のDOMに外部要素をインポートする際に問題があります。 恐ろしい「間違ったドキュメントエラー」メッセージが表示され続けます。

私は自分が何をしているのか知っていたと思いましたが、私は間違っていたと思います。 次のコードを見ると、現在のドキュメントの要素に一致する最初の反復、次に外部ドキュメントの一致する要素の反復であることがわかります。

2番目のネストされたループ内では、各外部要素を現在のドキュメントの宛先パスにマージしようとしています。

追加する前に現在のドキュメントに外部ノードを明確にインポートしているため、ここで何が間違っているのかわかりません。

public function merge($source, $path_origin, $path_destination)
{
    $Dom = new self;

    if(false == $Dom->loadXml($source))
    {
        throw new DOMException('XML source could not be loaded into the DOM.');
    }

    $XPath = new DOMXPath($Dom);

    foreach($this->path($path_destination, true) as $Destination)
    {
        if(false == in_array($Destination->nodeName, array('#text', '#document')))
        {
            foreach($XPath->query($path_origin) as $Origin)
            {
                if(false == in_array($Destination->nodeName, array('#text', '#document')))
                {
                    $this->importNode($Origin, true);

                    $Destination->appendChild($Origin->cloneNode(true));
                }
            }
        }
    }

    return $this;
}

ライブラリは、次のGithubリポジトリで完全に見つけることができます。

半減!!!

  1  0


ベストアンサー

`importNode`はノードを「変更」しないため、別のドキュメントに属します。 新しいドキュメントに属する新しいノードを作成して返します。 したがって、戻り値を取得し、appendChildで_that_を使用する必要があります。

$Destination->appendChild($this->importNode($Origin, true));

2


タイトルとURLをコピーしました