Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-删除XML元素_Php_Xml - Fatal编程技术网

PHP-删除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> <

我需要使用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>

本
本的电子邮件
本斯电文
约翰·史密斯
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)
请看一看

  • 如此

即使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\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]);
}