我需要使用PHP删除XML文件的元素。它将通过ajax完成,我需要通过属性找到XML元素。
这是我的XML文件
<?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>john@smith.com</email>
<msg>Can you do this for me?</msg>
</message>
</messages>
所以我要说的是删除时间等于1248083838的元素。
到目前为止,我一直在使用Simple XML,我刚刚意识到它可以执行除删除元素之外的所有操作。
那我该怎么做呢?
答案 0 :(得分:10)
Dave Morgan的正确之处在于DOM类更强大,但如果您想坚持使用SimpleXML,请尝试在任何节点上使用unset()函数。例如。 unset($ simpleXMLDoc-&gt; node1-&gt; child1),将从XML中删除。
答案 1 :(得分:9)
您可以在PHP中使用DOM类。 (http://us3.php.net/manual/en/intro.dom.php)。
您需要将XML文档读入内存,使用DOM类进行操作,然后根据需要(http或文件)保存XML。
DOMNode是一个具有删除功能的对象(用于解决您的问题)。
它比SimpleXML稍微复杂一点,但是一旦你习惯它,它会更强大
(从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();
?>
这应该给你一些关于如何删除元素的想法。它将打印出没有该节点的XML。如果你想将它发送到文件,只需将字符串写入文件。
答案 2 :(得分:2)
请看一下
答案 3 :(得分:2)
尽管SimpleXML没有详细的方法来删除元素,但可以使用PHP的unset()
从SimpleXML中删除元素。这样做的关键是管理目标所需的元素。至少一种进行定位的方法是使用元素的顺序。首先找出要删除的元素的订单号(例如使用循环),然后删除元素:
$target = false;
$i = 0;
foreach ($xml->message as $m) {
if ($m['time']=='1248083838') { $target = $i; break; }
$i++;
}
if ($target !== false) {
unset($xml->message[$target]);
}
您甚至可以通过在数组中存储目标项的订单号来删除多个元素。只需记住以相反的顺序(array_reverse($targets)
)进行删除,因为删除项目会自然地减少后面项目的订单号。
不可否认,这有点令人讨厌,但似乎工作正常。