从XML中删除具有特定值的节点


Remove nodes from XML with specific value

我想根据子节点值从XML中删除一个节点。

这是我的XML结构:

<?xml version="1.0" encoding="UTF-8"?>   
<urlset>
    <url>
        <loc></loc>
        <prority></priority>
        <lastmod></lastmod>
    </url>
    <url>
        <loc></loc>
        <prority></priority>
        <lastmod></lastmod>
    </url>
    <url>
        <loc></loc>
        <prority></priority>
        <lastmod></lastmod>
    </url>
</urlset>

这是我的php:

<?php
    $xml = simplexml_load_string($args);
    $nodes = $xml->children();
    foreach ($nodes as $node) {
        if ((strpos($node->loc, 'cHash') || strpos($node->loc, 'index.php')) !== FALSE) {
             $loc = dom_import_simplexml($node->loc);
             $loc->parentNode->removeChild($loc);
        }
    }
    $args = $xml->asXML();
?>

我在"loc"的字符串值中搜索"cHash"answers"index.php",然后如果是这种情况,我想删除父元素url(和所有子元素)。条件正在工作,但我无法选择要删除的整个url节点。这个php片段只删除了"loc"-节点。首先,正如许多帖子所建议的那样,我在unset()中尝试了它,但它不起作用。所以我找到了这个,导入到dom元素,然后删除它。

我认为应该是这样的:

$loc = dom_import_simplexml($node->loc);
$loc->parentNode->parentNode->removeChild($loc->parentNode);

或者这个:

$loc = dom_import_simplexml($node->loc);
$url = dom_import_simplexml($node);
$url->parentNode->removeChild($url);

这是试错,请帮忙!

$url = dom_import_simplexml($node);
$url->parentNode->removeChild($url);

这应该会给你所需要的,因为你的情况,它不起作用:

(strpos($node->loc, 'cHash') || strpos($node->loc, 'index.php')) !== FALSE

不应该是这个吗??

(strpos($node->loc, 'cHash') || strpos($node->loc, 'index.php'))