【问题标题】:Remove node on XML dom doc by selecting value通过选择值删除 XML dom 文档上的节点
【发布时间】: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 更改为任何我需要删除的货币...

【问题讨论】:

    标签: php xml dom nodes element


    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-08
      • 1970-01-01
      • 2011-03-07
      • 2016-11-05
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多