PHP按属性删除XML节点
我们已经尝试了许多这样的例子,但没有一个奏效 目标:按特定id删除节点(单元)及其子节点= filename.xmlPHP按属性删除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">
<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');