如何用php删除xml中按属性搜索的节点及其子节点

如何用php删除xml中按属性搜索的节点及其子节点,php,xml,simplexml,Php,Xml,Simplexml,我的XML文件如下所示,我将XML用作外部文件: <?xml version="1.0"?> <custscales> <custscale sclNo="1" type="lin"> <scaleName>Custom Scale Lin</scaleName> <jsfunc>custLin</jsfunc> </custscale> <

我的XML文件如下所示,我将XML用作外部文件:

<?xml version="1.0"?>
<custscales>
    <custscale sclNo="1" type="lin">
        <scaleName>Custom Scale Lin</scaleName>
        <jsfunc>custLin</jsfunc>
    </custscale>
    <custscale sclNo="2" type="map">
        <scaleName>Custome Scale Map</scaleName>
        <jsfunc>custMap</jsfunc>
    </custscale>
    <custscale sclNo="3" type="pol">
        <scaleName>Custome Scale Pol</scaleName>
        <jsfunc>custPol</jsfunc>
    </custscale>
    <custscale sclNo="4" type="tbl1">
        <scaleName>Custome Scale Table</scaleName>
        <jsfunc>custTbl1</jsfunc>
    </custscale>
</custscales>

自定义比例尺
卡斯特林
自定义比例地图
卡斯特地图
自定义比例油料
卡斯特波尔
自定义比例表
CUSTBL1
从上面的xml文件中,我只想删除sclNo=“4”中的节点,我的意思是保存后,下面的节点不应该在文件中

    <custscale sclNo="4" type="tbl1">
        <scaleName>Custome Scale Table</scaleName>
        <jsfunc>custTbl1</jsfunc>
    </custscale>

自定义比例表
CUSTBL1

请使用simpleXML给出示例。

使用
simpleXML

<?php

$doc = new DOMDocument; 
$doc->load('theFile.xml');

$thedocument = $doc->documentElement;

$list = $thedocument->getElementsByTagName('custscale ');


$nodeToRemove = null;
foreach ($list as $domElement){
  $attrValue = $domElement->getAttribute('sclNo');
  if ($attrValue == '4') {
    $nodeToRemove = $domElement; //will only remember last one- but this is just an example :)
  }
}

if ($nodeToRemove != null)
$thedocument->removeChild($nodeToRemove);

echo $doc->saveXML(); 
?>
$xml = simplexml_load_string($x); // assume XML in $x
$i = count($xml); 

for ($i; $i > 0; $i--) {   
    $cs = $xml->custscale[$i];
    if ($cs['sclNo'] == "4") unset($xml->custscale[$i]);
}
要求使用simpleXML给出示例

这一点已在中详细概述

关键的一点是,您将要取消设置的元素分配给一个变量—例如,
$element
—例如,通过使用Xpath查询()查询单个或多个节点—然后它:

在simplexml中已经是这样了。正如你所看到的,这真的很简单。一个完整的例子:

$xml = simplexml_load_string(<<<BUFFER
<path>
 <to>
   <element>
     <to delete="true" />
   </element>
 </to>
</path>
BUFFER;
);

$element = $xml->xpath('/path/to/element/to[@delete = "true"]')[0];
unset($element[0]);

$xml->asXML('php://output');

$xml=simplexml\u load\u string(@Rolando Isidoro)你能回答我的问题吗?你在运行哪个具体问题?你的代码在哪里?你在哪里遇到了错误?什么具体不起作用?你在哪里遇到了困难?有错误消息吗?本网站上的现有解决方案中哪些对你不起作用?以及写作“提前感谢”通常被其他用户认为是粗鲁的,最好不要这样做。-1因为没有提供自己的代码和粗鲁的反馈给那些花时间和精力回答问题的人。@Sonnet:当然有效。你在某个地方出错了。在原始问题中发布代码,比仅仅发布“不起作用”要容易得多“.很好的一个,从来都不知道如何通过路径+1实现。我发布的确切代码可能对您的程序不起作用。但相信我,这就是删除特定节点的方式;)。请查看提供的链接。
$xml = simplexml_load_string(<<<BUFFER
<path>
 <to>
   <element>
     <to delete="true" />
   </element>
 </to>
</path>
BUFFER;
);

$element = $xml->xpath('/path/to/element/to[@delete = "true"]')[0];
unset($element[0]);

$xml->asXML('php://output');