2010-01-19 76 views

Trả lời

20

Như nó được mentionned, SimpleXML không hỗ trợ đó để bạn sẽ phải sử dụng DOM. Dưới đây là những gì tôi khuyên bạn nên: mở rộng SimpleXMLElement với bất kỳ thứ gì bạn cần sử dụng trong các chương trình của mình. Bằng cách này, bạn có thể giữ tất cả thao tác DOM và phép thuật XML khác bên ngoài chương trình thực tế của bạn. Bằng cách giữ hai vấn đề riêng biệt, bạn cải thiện khả năng đọc và bảo trì.

Dưới đây là làm thế nào để kéo dài SimpleXMLElement với một phương pháp prependChild mới():

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

câu trả lời xuất sắc. – understack

+0

Chính xác những gì tôi đang tìm kiếm - cảm ơn bạn –

+0

Gọi đến phương thức chưa xác định SimpleXMLElement :: prependChild() – user254153

5

Nó không giống như SimpleXML hỗ trợ làm điều đó, vì vậy bạn có hai lựa chọn:

  1. Sử dụng các module DOM thay vì (hoặc một trong các module XML khác, có lẽ), và sử dụng DOMNode::insertBefore method, hoặc

  2. Tạo SimpleXMLElement mới, sao chép các thuộc tính, sau đó thêm nút mới của bạn, sau đó thêm tất cả các nút con của nút gốc của bạn sau đó, sau đó thay thế bản gốc bằng nút gốc mới.

update: Sau một chút tìm kiếm hơn thông qua các tài liệu, tôi muốn đề nghị một cái gì đó như sau (giả sử bạn vẫn muốn gắn bó với SimpleXML cho hầu hết các phần, nếu không, chỉ cần sử dụng DOM trực tiếp cho tất cả mọi thứ):

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

Tôi đã sử dụng cách tiếp cận thứ 2. Nhưng nó trông xấu xí vì vậy nghĩ đến việc yêu cầu lựa chọn thay thế tốt hơn. – understack

2

Giả sử bạn có thể sử dụng chức năng insert_before bạn có thể sử dụng chức năng sau:

chức năng prependChild (cha mẹ, node) { parent.insertBefore (nút, parent.firstChild); tài liệu tham khảo }

Nguồn: XML Matters: Beyond the DOM

+0

+1 cho định nghĩa hàm – understack

Các vấn đề liên quan