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

Posted

技术标签:

【中文标题】从 XML 中删除具有特定值的节点【英文标题】:Remove nodes from XML with specific value 【发布时间】:2015-04-25 23:49:26 【问题描述】:

我想根据子节点值从 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”和“index.php”,然后如果是这种情况,我想删除父元素 url(和所有子元素)。条件有效,但我无法选择要删除的整个 url 节点。这个 php sn-p 只删除“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);

这是反复试验,请帮助!

【问题讨论】:

【参考方案1】:
$url = dom_import_simplexml($node);
$url->parentNode->removeChild($url);

这应该可以满足您的需求,由于您的情况,它无法正常工作:

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

不应该是这样吗??

(strpos($node-&gt;loc, 'cHash') || strpos($node-&gt;loc, 'index.php'))

【讨论】:

以上是关于从 XML 中删除具有特定值的节点的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式从字符串中删除属性值不是特定值的所有 xml 节点

不能只删除链接列表中的最后一个元素! (所有其他具有特定值的元素都会被删除)

使用 sed 从类似 XML 的文件中删除特定文本

使用 TypeScript 从数组中删除具有特定 id 字段值的对象的聪明方法是啥? [复制]

如何从 php 数组中删除具有特定值的所有元素? (以尽可能最短的方式)[重复]

如何使用 Flutter 在 Firestore 中删除具有特定值的多个文档