PHP 按值查找节点并将其删除 XML

PHP find the node by value and remove it XML

我在 XML 文件中列出了具有此结构的所有属性

<property>
  <details>
        <object>25.5 m2 Flat in New York</object>
  </details>
</property>
<property>
  <details>
        <object>95.6 m2 House in New Jersey</object>
  </details>
</property>

现在我想使用 PHP 查找具有特定 <object> 值的节点并删除父节点 (<property>)。 我该怎么做?

我尝试执行下面的代码,但无法正常工作。

$doc = new DOMDocument;
$doc->load('../openimmo/xml-import1.xml');

$thedocument = $doc->documentElement;

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

$nodeToRemove = null;
foreach ($list as $domElement) {
    $attrValue = $domElement->getElementsByTagName('object');
    foreach ($attrValue as $item) {
        if ($item->nodeValue == $_GET['delete']) {
            $nodeToRemove = $domElement;
        }
    }
}

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

echo $doc->saveXML(); 

您可以使用 Xpath 表达式来获取节点。这允许您使用条件。

$document = new DOMDocument;
//$document->load('../openimmo/xml-import1.xml');
$document->loadXML($xml);
$xpath = new DOMXpath($document);

$objectText = '25.5 m2 Flat in New York';
$properties = $xpath->evaluate('//property[details/object = "'.$objectText.'"]');
foreach ($properties as $property) {
    // remove the node (PHP 8)
    $property->remove();
}

echo $document->saveXML(); 

另一个区别是DOMXpath::evaluate()的结果不是直播。与 DOMNode::getElementsByTagName() 的结果不同,如果 DOM 改变,它不会改变。

PHP 8 添加了 DOM 生活标准方法。在 PHP 7 中,您必须使用 $property->parentNode->removeChild($property).