XML Добавление атрибута в неправильный узел - PullRequest
0 голосов
/ 09 ноября 2018

Я новичок в xml и не могу понять, как установить атрибут rate для узла code . По какой-то причине он устанавливает атрибут для узла currency .

<?

@date_default_timezone_set("GMT"); 
if (isset($_POST['Submit']))
{
    $xml=new DomDocument("1.0","UTF-8");
    $xml->formatOutput=true;
    $xml->preserveWhiteSpace=false;
    $xml->load('rates.xml');

    $curcode = $_POST['currency-code'];
    $newrate = $_POST['rate'];

    $change = new DOMXpath($xml);

    $update = $change->query("//*[code = '$curcode']");
    $update->item(0)->setAttribute("rate", $newrate);
    $xml->save('rates.xml');
}
?>

Вот XML:

<currencies>
  <currency>
    <code rate="18.543343372942">ZAR</code>
    <cname>Rand</cname>
    <cntry>Lesotho, Namibia, South Africa</cntry>
  </currency>
  <currency>
    <code rate="123">test</code>
    <cname>ewwwwwww</cname>
    <cntry>rew</cntry>
  </currency>
  <currency rate="432432434332432">
    <code rate="1234">testnew</code>
    <cname>nene</cname>
    <cntry>fnnfr</cntry>
  </currency>
</currencies>

Как видите, на последнем узле currency обновляется курс валюты вместо кода code .

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 10 ноября 2018

Ваш запрос XPath возвращает элемент <currency>.
Потому что //*[code = '$curcode'] выбирает все элементы, которые имеют элемент code со значением $curcode.

Так что все, что вам нужно, это просто выбрать code элемент. Как это:

$update = $change->query("//*[code = '$curcode']/code");

или

$update = $change->query("//code[text() = '$curcode']");
...