2010-02-01 13 views
19

Bir dizi SimpleXML nesnesini yineliyorum ve her bir nesnenin ana düğümüne nasıl erişileceğini anlayamıyorum. İstediğim şey:Bir öğenin ebeveynine PHP'nin SimpleXML'sine mi erişin?

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

Bunun için oldukça kolay bir yol olmalı.

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

Ve bu SimpleXML olduğu gibi ve sadece elemanı vardır ve düğümleri öznitelik ve bir üst düğüm sadece bir eleman ve asla bir özellik olabilir:

cevap

35

Bunu elde etmek için basit bir XPath sorgusu çalıştırabilir kısaltılmış sözdizimi kullanılabilir:

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

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

+0

Will bu yöntemi: Bu belge için my_xml nesneler, böylece get_parent_node() yöntem chainable yapar başka bir şey değiştirmek gerekmez ** her zaman bir ebeveyn geri dönüyor mu? Fark ettim ki bir dizi döndürür. – mrClean

6

bellek hizmet, bir xpath() arama bir veya daha fazla 0 döndürür. Eğer durum buysa, o zaman böyle bir şey kullanmak mümkün olabilir: Eğer SimpleXML uzatabilirsiniz

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

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

Not yüzden bunu yapmak için. Örneğin:

$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 saydam dönecektir şudur: Şimdi

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

Ve sen ilk etapta SimpleXMLElement oluşturmak için kullandığınız kodunu değiştirmek yapmanız gereken tüm

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

Harika, Josh ... çok aydınlatıcı. Eminim gelecekte bunu her türlü şey için kullanacağım! – thisismyname

+0

Teşekkürler Josh - gerçekten çok yararlı. – halfer

İlgili konular