2016-11-21 83 views
0

試圖讓貨幣轉換的API卸下XML DOM文檔節點,通過選擇價值

需要選擇特定的貨幣,並從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爲無論刪除任何貨幣我需要...

回答

0

您迭代根節點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>