PHP XMLReader ebeveyn düğüm oluyor?

3 Cevap php

XMLReader yöntemi kullanarak bir XML dosyasını ayrıştırma iken, nasıl bir elemanın üst düğüm alabilirim?

$xml = new XMLReader();
$xml->XML($xmlString);
while($xml->read())
{

$xml->localName; // gives tag name
$xml->value; // gives tag value

// how do I access the parent of this element 
}

3 Cevap

Kısa Versiyon: Sen en azından doğrudan, yok. Bu XMLReader ile ayrıştırma algoritması içine bağlamı kod programcı kalmış.

Uzun Sürüm: PHP'nin XMLReader bir pull parser adlandırılan şeydir. Pull ayrıştırıcılar onlar metin akışları ile başa çıkabilirim bir ağaç / dom tabanlı çözümleyici farklıdır. Diğer bir deyişle, onlar tüm belge var önce belgeyi ayrıştırma başlayabilirsiniz. Bu her şeyi yapabilir önce belleğe tüm belgeyi gerekiyor SimpleXML veya DOMDocument gibi bir ağaç tabanlı / DOM çözümleyici farklıdır.

Avantajı 75MB XML dosyası varsa onunla başa çıkmak için ücretsiz RAM 75MB gerekmez, (Eğer bir ağaç tabanlı çözümleyici ile olduğu gibi). Trade-off ayrıştırıcılarda tüm belgenin içeriğini asla çekmek. Sadece şu anda işlem için ne olursa olsun düğüm bağlamı var.

Bunu düşünmek için başka bir yolu ağaç / dom tabanlı ayrıştırıcı sizin için bunu sormak için gidiyoruz ne bilmiyor çünkü belgenin her parçası hakkında bilmek zorunda değildir. Sen ve çekme ayrıştırıcı, ancak, farklı bir düzenleme yaptık. Bu size atma düğümleri tutmak ve onların içeriği ile başa çıkmak için o kadar bırakacağım.

Burada ne peşinde (umarım) yakın bazı örnek kod.

$xml = new XMLReader(); 
$xml->open('example.xml');
$last_node_at_depth = array();
while($xml->read())
{               
    //stash the XML of the entire node in an array indexed by depth
    //you're probably better off stashing exactly what you need from
    $last_node_at_depth[$xml->depth] = $xml->readOuterXML();

    $xml->localName; // gives tag name
    $xml->value;     // gives tag value     

    //so, right now we're at depth n in the XML document.  depth n-1 
    //would be our parent node
    if ($xml->depth > 0) {
        //gives the fragment that starts with the parent node       
        $last_node_at_depth[($xml->depth-1)];   
    }
}

Ben XMLReader genişletmek () fonksiyonunu kullanarak başladı. Bu akım xml etiketi bir DOM temsil verir. Ben ana düğüm, daha sonra (ayrıştırma) yolu çocuğun değerlerini ekstre zamanki DOMDocument kullanarak, bana ana etiketinin DOM elemanı verdi () genişletin kullanılır.

//usage
$xml = new XMLReader();
$xml = $xml->XML($xmlResponse);
while($xml->read())
{
$parent = $xml->expand();

$firstChildValue = $parent->getElementsByTagName('child')->item(0)->nodeValue;
}

Belleğe XML işlevi yükler genişletmek sadece o kadar kısmını kullanarak yerine belleğe tüm XML yükleme.

Ben seni istiyorum: XMLReader::moveToElement