通过选择值删除 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 文档上的节点的主要内容,如果未能解决你的问题,请参考以下文章