2010-01-19 18 views

cevap

20

, SimpleXML o desteklemez. İşte size önerdiğim şey: SimpleXMLElement'i, programlarınızda kullanmanız için gereken her şeye genişletmek. Bu şekilde, tüm DOM manipülasyonunu ve diğer XML sihrini gerçek programınızın dışında tutabilirsiniz. İki konuyu ayrı tutarak, okunabilirliği ve sürdürülebilirliği geliştirirsiniz.

İşte yeni yöntem prependChild() ile SimpleXMLElement uzatmak için: Zaten 2 yaklaşım kullanıyorum

class my_node extends SimpleXMLElement 
{ 
    public function prependChild($name, $value) 
    { 
     $dom = dom_import_simplexml($this); 

     $new = $dom->insertBefore(
      $dom->ownerDocument->createElement($name, $value), 
      $dom->firstChild 
     ); 

     return simplexml_import_dom($new, get_class($this)); 
    } 
} 

$actors = simplexml_load_string(
    '<actors> 
     <actor>Al Pacino</actor> 
     <actor>Zsa Zsa Gabor</actor> 
    </actors>', 
    'my_node' 
); 

$actors->addChild('actor', 'John Doe - last'); 
$actors->prependChild('actor', 'John Doe - first'); 

die($actors->asXML()); 
+0

mükemmel cevap. – understack

+0

Tam olarak aradığım şey - teşekkürler –

+0

Tanımlanmamış yönteme çağrı SimpleXMLElement :: prependChild() – user254153

5

Bu iki seçeneğiniz vardır, böylece SimpleXML yapıyor destekler gibi görünmüyor: (muhtemelen, ya da diğer XML modüllerinden biri)

  1. Kullanım DOM yerine modül ve DOMNode::insertBefore method kullanın veya

  2. Yeni bir SimpleXMLElement oluşturun, niteliklerin üzerine kopyalayın ve ardından yeni düğümünüzü ekleyin, ardından orijinal düğümün tüm çocuklarını ekleyin, ardından orijinali yenisiyle değiştirin.

güncelleme: biraz daha dokümanlar incelendikten sonra , şöyle bir şey öneririm aşağıdaki (aksi takdirde, sadece doğrudan DOM kullanmak, hala çoğunlukla SimpleXML ile sopa istediğiniz varsayarak herşey):

$dom_elem = dom_import_simplexml($simple_xml_element); 
$dom_elem->insertBefore(dom_import_simplexml($new_element), $dom_elem->firstChild); 
+0

. Ama çirkin görünüyordu, bu yüzden daha iyi alternatifler sormayı düşündüm. – understack

2

aşağıdaki fonksiyonu kullanabilirsiniz insert_before sen işlevini kullanabilirsiniz varsayarsak:

fonksiyon prependChild (ebeveyn, düğüm) { parent.insertBefore (node, parent.firstChild); }

Kaynak referansı: o mentionned oldu olarak, DOM kullanmak zorunda diye, XML Matters: Beyond the DOM

+0

+1 işlev tanımı – understack

İlgili konular