1

約 1 年前、PHP の XPath と DOMDocument を使用して DOM を操作できるようにする、jQuery に着想を得たライブラリーを作成しました。私は最近、それをクリーンアップして、オープン ソース プロジェクトとして投稿したいと考えていました。ここ数日、PHP のネイティブ OO 機能の改善と実装に費やしてきました。

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

この方法は、両方のパスから一致する要素を取得する際にうまく機能しますが、現在の DOM に外部要素をインポートする際に問題が発生しています。恐ろしい「Wrong Document Error」メッセージが表示され続けます。

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

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 リポジトリにあります。

http://github.com/wilhelm-murdoch/DomQuery

ハーフ!!!

4

1 に答える 1

2

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

$Destination->appendChild($this->importNode($Origin, true));
于 2010-01-06T02:12:37.607 に答える