PHP-删除XML元素
我需要使用PHP删除XML文件的元素。这将通过ajax完成,我需要通过属性找到XML元素 这是我的XML文件PHP-删除XML元素,php,xml,Php,Xml,我需要使用PHP删除XML文件的元素。这将通过ajax完成,我需要通过属性找到XML元素 这是我的XML文件 <?xml version="1.0" encoding="utf-8"?> <messages> <message time="1248083538"> <name>Ben</name> <email>Ben's Email</email> <
<?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>
本
本的电子邮件
本斯电文
约翰·史密斯
john@smith.com
你能帮我做这个吗?
所以我想说的是,删除时间等于12480838的元素
到目前为止,我一直在使用简单的XML,我刚刚意识到它可以做除删除元素之外的任何事情
那么我该怎么做呢?您可以在PHP中使用DOM类。() 您需要将XML文档读入内存,使用DOM类进行操作,然后根据需要保存XML(到http或文件) DOMNode是其中的一个对象,它具有删除功能(以解决您的问题) 它比SimpleXML稍微复杂一点,但一旦您习惯了它,它就会更加强大 (摘自php.net上的代码示例)
documentElement;
//这将为您提供一个消息列表
$list=$thedocument->getElementsByTagName('message');
//找出你想要的——将它分配给一个变量(即:$nodeToRemove)
$nodeToRemove=null;
foreach($domElement){
$attrValue=$doElement->getAttribute('time');
如果($attrValue=='valueyoucareaout'){
$nodeToRemove=$domeElement;//将只记住最后一个-但这只是一个示例:)
}
}
//现在移除它。
如果($nodeToRemove!=null)
$thedocument->removeChild($nodeToRemove);
echo$doc->saveXML();
?>
这将使您对如何删除元素有一点了解。它将打印出没有该节点的XML。如果要将其发送到文件,只需将字符串写入文件。Dave Morgan是正确的,因为DOM类更强大,但如果您想坚持使用SimpleXML,请尝试在任何节点上使用unset()函数,该节点将从XML中删除
unset($simpleXMLDoc->node1->child1)
请看一看
- 如此
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\u reverse($targets)
),因为删除项目自然会减少其后面项目的订单号
无可否认,这有点胡闹,但它似乎工作得很好。我没有尝试过这样做,但逻辑表明它应该工作得很好。听起来很快,但对我来说是适当的工作。对我来说,听起来不是很快。听起来像是正常的编码。我没有机会检查小的语法错误-但这应该会给你一些你需要的东西。我建议不要删除forloop本身中的子对象,因为它会弄乱foreach的内部计数器。
$target = false;
$i = 0;
foreach ($xml->message as $m) {
if ($m['time']=='1248083838') { $target = $i; break; }
$i++;
}
if ($target !== false) {
unset($xml->message[$target]);
}