2009-07-20 36 views
5

Tôi cần xóa các phần tử của tệp XML bằng PHP. Nó sẽ được thực hiện thông qua ajax và tôi cần tìm phần tử XML thông qua một thuộc tính.PHP - Xóa phần tử XML

Đây là tập tin XML của tôi

<?xml version="1.0" encoding="utf-8"?> 
<messages> 
    <message time="1248083538"> 
     <name>Ben</name> 
     <email>Ben's Email</email> 
     <msg>Bens message</msg> 
    </message> 
    <message time="1248083838"> 
     <name>John Smith</name> 
     <email>[email protected]</email> 
     <msg>Can you do this for me?</msg> 
    </message> 
</messages> 

Vì vậy, những gì tôi có thể nói là một cái gì đó như xóa phần tử nơi thời gian tương đương 1248083838.

Ive được sử dụng XML đơn giản cho đến bây giờ và tôi đã chỉ nhận ra nó có thể làm mọi thứ trừ các phần tử xóa.

Vậy tôi sẽ làm điều này như thế nào?

Trả lời

7

Bạn có thể sử dụng các lớp DOM trong PHP. (http://us3.php.net/manual/en/intro.dom.php).

Bạn sẽ cần phải đọc tài liệu XML vào bộ nhớ, sử dụng các lớp DOM để thực hiện thao tác, và sau đó bạn có thể lưu XML khi cần (http hoặc tệp).

DOMNode là một đối tượng trong đó có tính năng xóa (để giải quyết câu hỏi của bạn).

Đó là phức tạp hơn một chút so với SimpleXML nhưng một khi bạn đã quen với nó, nó mạnh hơn rất nhiều

(bán lấy từ một ví dụ mã tại php.net)

<?php 

$doc = new DOMDocument; 
$doc->load('theFile.xml'); 

$thedocument = $doc->documentElement; 

//this gives you a list of the messages 
$list = $thedocument->getElementsByTagName('message'); 

//figure out which ones you want -- assign it to a variable (ie: $nodeToRemove) 
$nodeToRemove = null; 
foreach ($list as $domElement){ 
    $attrValue = $domElement->getAttribute('time'); 
    if ($attrValue == 'VALUEYOUCAREABOUT') { 
    $nodeToRemove = $domElement; //will only remember last one- but this is just an example :) 
    } 
} 

//Now remove it. 
if ($nodeToRemove != null) 
$thedocument->removeChild($nodeToRemove); 

echo $doc->saveXML(); 
?> 

này nên cung cấp bạn một chút ý tưởng về cách xóa phần tử. Nó sẽ in ra XML mà không có nút đó. Nếu bạn muốn gửi nó vào tập tin, chỉ cần viết chuỗi vào tập tin.

+0

Hmm ... Tôi hơi bị choáng ngợp bởi mọi thứ ở đó. Bạn có thể giải thích thêm một chút không? –

+0

Chắc chắn. Tôi sẽ sửa. –

+0

Tôi không có cơ hội để kiểm tra lỗi cú pháp nhỏ - nhưng điều đó sẽ cung cấp cho bạn một cái gì đó giống như những gì bạn cần. Tôi khuyên bạn không nên bỏ con trong bản thân vì nó gây rối với bộ đếm nội bộ của foreach. –

9

Dave Morgan là đúng ở chỗ lớp DOM là mạnh hơn, nhưng trong trường hợp bạn muốn gắn bó với SimpleXML, hãy thử sử dụng chức năng unset() trên bất kỳ nút. Ví dụ. unset ($ simpleXMLDoc-> node1-> child1) và sẽ bị xóa khỏi XML.

+0

Tôi đã không cố gắng làm điều đó, nhưng logic ra lệnh rằng nó sẽ hoạt động tốt. Âm thanh như một công việc nhanh chóng, bẩn thỉu, nhưng thích hợp với tôi. –

+3

Không phát ra âm thanh nhanh chóng với tôi. Âm thanh như mã hóa bình thường. – Tjorriemorrie

1

Mặc dù SimpleXML không có một cách chi tiết để loại bỏ các yếu tố, bạn có thể loại bỏ các yếu tố từ SimpleXML bằng cách sử dụng unset() của PHP. Chìa khóa để thực hiện điều này là quản lý để nhắm mục tiêu phần tử mong muốn. Ít nhất một cách để thực hiện nhắm mục tiêu là sử dụng thứ tự của các phần tử. Đầu tiên tìm ra số thứ tự của các yếu tố bạn muốn loại bỏ (ví dụ với một vòng lặp), sau đó loại bỏ các yếu tố:

$target = false; 
$i = 0; 
foreach ($xml->message as $m) { 
    if ($m['time']=='1248083838') { $target = $i; break; } 
    $i++; 
} 
if ($target !== false) { 
    unset($xml->message[$target]); 
} 

Bạn thậm chí có thể loại bỏ nhiều yếu tố với điều này, bằng cách lưu trữ các số thứ tự của mục tiêu trong một mảng. Chỉ cần nhớ thực hiện việc xóa theo thứ tự ngược lại (array_reverse($targets)), vì việc xóa một mục sẽ tự động giảm số thứ tự của các mục theo sau nó.

Phải thừa nhận rằng, đó là một chút khó khăn, nhưng có vẻ như hoạt động tốt.

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