在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()
加载文件,遍历<server>
节点并检查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删除节点[重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用 $variable 作为索引取消设置 PHP SIMpleXML 节点