XPath ve kullanan iki XML belgeleri birleştirme hata

1 Cevap php

Yaklaşık bir yıl önce ben PHP'nin XPath ve DOMDocument kullanarak DOM işlemek için izin verilen bir jQuery ilham kitaplığı yazdı. Geçenlerde o kadar temiz ve açık kaynak kodlu bir proje olarak yayınlamak istedim. Ben iyileştirmeler yapmak son birkaç gün geçirdikten ve PHP'nin OO bazı özellikleri daha fazlasını uygulayarak oldum.

Her neyse, ben sana şimdiki biriyle ayrı bir XML belgeyi birleştirmek için olanak sağlayan yeni bir yöntem eklemek düşündüm. Burada yakalamak bu yöntem 2 XPath ifadeleri sorar olmasıdır. İlki mevcut belgede birleştirmek istediğiniz öğeleri getirir. İkinci bu birleşmiş unsurların hedef yolunu belirtir.

Yöntem her iki yoldan getiriliyor eşleşen elemanları iyi çalışır, ama ben geçerli DOM'ye yabancı unsurları ithal ile ilgili sorunlar yaşıyorum. Ben korkunç 'Yanlış Belge Hatası' mesajı alıyorum.

Ben ne yaptığımı biliyordum düşündüm, ama ben yanlış olduğunu varsayalım. Aşağıdaki kodu bakarsanız, o zaman yabancı belgenin eşleşen elemanları aracılığıyla, unsurları eşleştirerek mevcut belgeler üzerinden ben ilk yineleme olduğumu görebiliyorum.

Ben Geçerli belgede hedef yoluna her yabancı eleman birleştirme çalışılıyor nerede ikinci iç içe döngü içinde.

Ben açıkça ekleme önce geçerli belgeye yabancı düğümü ithal kulüpler gibi ben burada yanlış yapıyorum ne emin değil.

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;
}

Aşağıdaki Github repo bütünüyle kütüphane bulabilirsiniz:

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

Halps!

1 Cevap

Başka bir belgeye ait böylece importNode etmez "değişim" düğüm. Bu yeni belgeye ait yeni bir düğüm oluşturur ve döndürür. Yani dönüş değerini alma ve that Appendchild kullanılarak yapılmalıdır.

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