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)
.
我在 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)
.