通过选择值删除 XML dom 文档上的节点

Posted

技术标签:

【中文标题】通过选择值删除 XML dom 文档上的节点【英文标题】:Remove node on XML dom doc by selecting value 【发布时间】:2017-04-05 06:19:54 【问题描述】:

尝试制作一个用于货币转换的 API,

需要选择特定货币并从xml文件中删除...

XML 文件如下所示:

<currencies>
    <currency>
        <ccode>CAD</ccode>
        <cname>Canadian Dollar</cname>
        <cntry>Canada</cntry>
    </currency>
    <currency>
        <ccode>CHF</ccode>
        <cname>Swiss Franc</cname>
        <cntry>Liechtenstein, Switzerland</cntry>
    </currency>
    <currency>
        <ccode>CNY</ccode>
        <cname>Yuan Renminbi</cname>
        <cntry>China</cntry>
    </currency>
...etc

我需要使用php来选择和删除特定货币,目前尝试这个:

<?php
$dom = new DOMDocument("1.0", "utf-8");
$dom->load('data/ccodes.xml');
$nodes = $dom->getElementsByTagName("currencies");
foreach ($nodes as $n)
    if($n->getAttribute("ccode") == "CAD") 
        $parent = $n->parentNode;
        $parent->removeChild($n);
    
  
echo $dom->saveXML();
?>

但它不起作用......我很确定它真的很简单,但我不知道我在用编码做什么......:/

需要这样做,这样我就可以将 CAD 更改为任何我需要删除的货币...

【问题讨论】:

【参考方案1】:

您迭代根节点 currencies 但我认为您的意思是迭代 currency 节点。 ccode 不是属性节点,而是子元素节点。即使您使用正确的条件迭代 currency 节点,它仍然无法完全工作。

DOMElement::getElementsByTagName() 返回实时结果。在循环中,您修改了 DOM,并且列表也被修改了。您可以使用for 循环向后迭代它,使用iterator_to_array() 将节点列表具体化为数组或使用Xpath。 DOMXpath::evaluate() 返回一个节点列表,但它不是实时结果。因此,如果您修改文档,列表不会更改。

$document = new DOMDocument();
//$document->load('data/ccodes.xml');
$document->loadXml($xml);
$xpath = new DOMXpath($document);

foreach ($xpath->evaluate('/currencies/currency[ccode="CAD"]') as $node) 
  $node->parentNode->removeChild($node);    


echo $document->saveXML();

输出:

<?xml version="1.0"?>
<currencies>

    <currency>
        <ccode>CHF</ccode>
        <cname>Swiss Franc</cname>
        <cntry>Liechtenstein, Switzerland</cntry>
    </currency>
    <currency>
        <ccode>CNY</ccode>
        <cname>Yuan Renminbi</cname>
        <cntry>China</cntry>
    </currency>
</currencies>

【讨论】:

以上是关于通过选择值删除 XML dom 文档上的节点的主要内容,如果未能解决你的问题,请参考以下文章

XML DOM 节点树概述

详解SimpleXML添加_修改_删除_遍历XML节点属性

XML 通过属性值 JavaScript 删除节点

javascript动态添加删除表格

PHP 从XML中删除DOM节点

XML DOM(Document Object Model)