PHP按属性删除XML节点

PHP按属性删除XML节点,php,xml,xpath,Php,Xml,Xpath,我们已经尝试了许多这样的例子,但没有一个奏效 目标:按特定id删除节点(单元)及其子节点= filename.xml <archive> <unit id="0424670018"> <data>Blah blah blah #1</data> <gdate>2018-05-28 00:42:46</gdate> </unit> <unit id="0450170018">

我们已经尝试了许多这样的例子,但没有一个奏效

目标:按特定id删除节点(单元)及其子节点=

filename.xml

<archive>
  <unit id="0424670018">
    <data>Blah blah blah #1</data>
    <gdate>2018-05-28 00:42:46</gdate>
</unit>
  <unit id="0450170018">
    <data>Blah blah blah #2</data>
    <gdate>2018-05-28 00:45:01</gdate>
  </unit>
</archive>
您需要使用“DOMDocument”类


可以使用Xpath获取节点。它允许直接获取匹配的节点

$id = '0450170018';

$document = new DOMDocument();
$document->load('filename.xml');
$xpath = new DOMXpath($document);
foreach ($xpath->evaluate("//unit[@id='$id']") as $unitNode) {
  $unitNode->parentNode->removeChild($unitNode);
}
$document->save('filename.xml');

小心,
getElementsByTagname()
返回一个“实时”结果(如果修改DOM,它会发生变化)。如果删除多个节点,这可能无法按预期工作。@我将通过发布$id的删除表单一次只删除一个节点,到目前为止,它是成功的。我也将测试您的代码,然后做出决定。这也很好用,你上面的反驳让我选择了这个版本。谢谢。
$doc = new DOMDocument;
$doc->load('filename.xml');
$xml = $doc->documentElement;
$id = '0450170018';
$domNodeList = $xml->getElementsByTagname('unit'); 
foreach ( $domNodeList as $domElement ) { 

    $valueID = $domElement->getAttribute('id'); 
    if($valueID == $id)
    {
        $xml->removeChild($domElement);
    }
}
$doc->save('filename.xml');
$id = '0450170018';

$document = new DOMDocument();
$document->load('filename.xml');
$xpath = new DOMXpath($document);
foreach ($xpath->evaluate("//unit[@id='$id']") as $unitNode) {
  $unitNode->parentNode->removeChild($unitNode);
}
$document->save('filename.xml');