在php中使用simplexml删除节点[重复]

Posted

技术标签:

【中文标题】在php中使用simplexml删除节点[重复]【英文标题】:Delete a node with simplexml in php [duplicate] 【发布时间】:2014-01-15 03:51:32 【问题描述】:

我有一个包含服务器的 xml 文件。

<?xml version="1.0" encoding="UTF-8"?>
<servers>
   <server>
      <location>Belgium</location>
      <ip>192.168.0.1</ip>
      <port>8080</port>
      <crt></crt>
   </server>
   <server>
      <location>Fhoto</location>
      <ip>192.168.0.5</ip>
      <port>7841</port>
      <crt>http://127.0.0.1/serv.crt</crt>
   </server>
   <server>
      <location>TestingPanel</location>
      <ip>192.168.1.2</ip>
      <port>6969</port>
      <crt>http://testingpanel.com/server.crt</crt>
   </server>
   <server>
      <location>TestingPanel2</location>
      <ip>192.168.1.3</ip>
      <port>6968</port>
      <crt>http://testingpanel.com/server1.crt</crt>
   </server>
</servers>

我制作了一个 php 页面,可以将服务器添加到文件中,效果很好。现在我想制作一个表单,您可以在其中输入 IP 并且 php 脚本应该删除整个节点。

例如。我有一个带有文本框的表单,我输入“192.168.0.1”。我希望它删除这个:

   <server>
      <location>Belgium</location>
      <ip>192.168.0.1</ip>
      <port>8080</port>
      <crt></crt>
   </server>

到目前为止我有这个(基本上没有):

if (isset($_POST["deleteServer"]))  
    //do processing

请指导我正确的方向,因为我不知道该怎么做。提前致谢!

【问题讨论】:

^ 它实际上与属性和元素一样工作,只需删除它前面的 @ Commercial-at-sign,然后 xpath 将其识别为元素(而不是属性) . - 请特别参阅此答案中概述的技术:***.com/a/16062633/367456 【参考方案1】:

使用simplexml_load_file()加载文件,遍历&lt;server&gt;节点并检查IP是否等于给定IP。

如果是,请在self-reference of the SimpleXMLElement node 上使用unset() 将其删除:

$xml = simplexml_load_file('file.xml');
foreach ($xml as $key => $server) 
    if ( $server->ip != '192.168.0.1') 
        continue;
    
    unset($server[0]);

Demo.

【讨论】:

您还可以使用条件启动 xpath 查询。 @hakre:当前版本发出警告。原来的答案有什么问题? 是的,该警告需要中断:eval.in/private/38933ffe246242(考虑到它是要删除的一个元素)或只是建议的 xpath。哪里错了?没有错,只是一些多余的操作,比如转换为字符串,而 PHP 为您执行此操作,或者不使用 unset 而是调用转换函数和其他对象方法。 这可能更好:eval.in/83809【参考方案2】:

我建议使用 DomDocument 和 Xpath 来查找节点:

$xml = new DOMDocument();
$xml->load($filePath);
$xpathXml = new DOMXPath($xml);

接下来你需要做的是找到节点:

$elements = $xpathXml->query("//Server[ip="$yourIp"]);

并删除从父节点中找到的元素:

foreach ($elements as $element) 
  $element->parentNode->removeChild($element);

【讨论】:

以上是关于在php中使用simplexml删除节点[重复]的主要内容,如果未能解决你的问题,请参考以下文章

从 PHP SimpleXML 节点获取实际值 [重复]

删除 PHP 中的 XML 节点 [重复]

详解SimpleXML添加_修改_删除_遍历XML节点属性

使用 $variable 作为索引取消设置 PHP SIMpleXML 节点

如何使用simpleXML(php)通过xpath获取父节点

在 SimpleXML for PHP 中删除具有特定属性的子项