如果包含标签,则删除父节点

Remove parent nodes if contains tag

我正在尝试从我的站点地图中删除 url 个包含优先级标签的元素。我做错了什么?

脚本:

<?php

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

$priorities = $xml->getElementsByTagName('priority');
foreach($priorities as $priority){
    $xml->removeChild($priority);
    }

echo $xml->saveXML();

现有站点地图:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>https://www.example.tld/</loc></url>
<url><loc>https://www.example.tld/file</loc></url>
<url><loc>https://www.example.tld/folder/</loc><priority>0.7</priority></url>
<url><loc>https://www.example.tld/folder2/</loc><priority>0.3</priority></url>
</urlset>

所需站点地图:

<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url><loc>https://www.example.tld/</loc></url>
<url><loc>https://www.example.tld/file</loc></url>
</urlset>

您必须使用 $priorityparentNode 而不是 $xml 来删除子项。

您可以使用 for 循环递减 $i

的值来循环集合,而不是使用 foreach
$xml = new DOMDocument;
$xml->load('sitemap.xml');

$priorities = $xml->getElementsByTagName('priority');
for ($i = $priorities->length - 1; $i >= 0; $i--) {
    $priorities[$i]->parentNode->removeChild($priorities[$i]);
}
echo $xml->saveXML();