2016-11-21 9 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(); 
?> 

Но это не работает. Я уверен, что это действительно просто, но я понятия не имею, что я делаю с кодированием ...:/

Нужно сделать так, чтобы я мог просто сменить САПР на чтобы удалить любую валюту Мне нужно ...

ответ

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>