PHP'nin SimpleXML bir elemanın üst erişebilir?

3 Cevap php

Ben SimpleXML nesneleri bir dizi yineleme, ve ben her nesnenin üst düğümünü erişmek için nasıl anlamaya olamaz. İşte ne istiyorum:

$divs = simplexml->xpath("//div");
foreach ($divs as $div)
{
   $parent_div = $div->get_parent_node(); // Sadly, there's no such function.
}

Bunu yapmak için oldukça kolay bir yolu olmalı gibi görünüyor.

3 Cevap

Bunu elde etmek için basit XPath sorgusu çalıştırabilir:

$parent_div = $div->xpath("parent::*");

Bu SimpleXML ve sadece eleman ve öznitelik düğümleri vardır ve bir üst düğüm sadece bir element ve asla bir özellik olabilir gibi, kısaltılmış sözdizimi kullanılır:

$parent_div = $div->xpath("..");

(Via: Common Xpath Cheats - SimpleXML Type Cheatsheet (Feb 2013; by hakre) )

$div->get_parent_node(); // Sadly, there's no such function.

Eğer bunu yapmak için SimpleXML uzatabilirsiniz unutmayın. Örneğin:

class my_xml extends SimpleXMLElement
{
    public function get_parent_node()
    {
        return current($this->xpath('parent::*'));
    }
}

Ve şimdi yapmanız gereken tüm ilk etapta SimpleXMLElement oluşturmak için kullanabileceğiniz kodunu değiştirmek olduğunu:

$foo = new SimpleXMLElement('<foo/>');
// becomes
$foo = new my_xml('<foo/>');

$foo = simplexml_load_string('<foo/>');
// becomes
$foo = simplexml_load_string('<foo/>', 'my_xml');

$foo = simplexml_load_file('foo.xml');
// becomes
$foo = simplexml_load_file('foo.xml', 'my_xml');

Iyi bölüm SimpleXML otomatik ve şeffaf my_xml Bu belge için nesneleri dönecektir, böylece get_parent_node() yöntemi chainable yapar başka bir şey, değiştirmek zorunda kalmamasıdır:

// returns $grandchild's parent's parent
$grandchild->get_parent_node()->get_parent_node();

Hafızam yanıltmıyorsa, bir xpath() çağrı birini veya daha fazlasını verir SimpleXMLElements. Bu durum buysa, o zaman gibi bir şey kullanmak mümkün olabilir:

$div->xpath( '..' );
# or
$div->xpath( 'parent::*' );