Изменить атрибут, если узел существует с Xpath? - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь изменить атрибут узла, если узел существует, или создать его, если не в файле XML, используя Xpath.XML-файл выглядит так:

<krpano>
    <hotspot name="hs1" ath="0" atv="0"/>
    <hotspot name="hs2" ath="0" atv="0"/>
</krpano>

и вот мой php-код:

<?php
$str_json = file_get_contents('php://input');
$json_data = json_decode($str_json);

$file = 'myxmlfile.xml';
$xml = simplexml_load_file($file);
$krpano = $xml->xpath("//krpano");
$hotspot = $xml->xpath('//hotspot[@name="'.$json_data->name.'"]');

if ($hotspot){
    $xml->xpath('//hotspot[@name="'.$json_data->name.'"]/@ath->'.$json_data->xpos.'');
    $xml->xpath('//hotspot[@name="'.$json_data->name.'"]/@atv->'.$json_data->ypos.'');
}else{
    $newhs = $krpano[0]->addChild('hotspot');
    $newhs->addAttribute('name', $json_data->name);
    $newhs->addAttribute('ath', $json_data->xpos);
    $newhs->addAttribute('atv', $json_data->ypos);
}

$xml->asXML($file);

?>

если узел не существует, то он добавляется, нет проблем, но если он существует,значения атрибута не изменены.

1 Ответ

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

Вы не можете изменять такие атрибуты с помощью XPath,

$xml->xpath('//hotspot[@name="'.$json_data->name.'"]/@ath->'.$json_data->xpos.'');
$xml->xpath('//hotspot[@name="'.$json_data->name.'"]/@atv->'.$json_data->ypos.'');

вам просто нужно изменить их прямо из точки доступа, которая у вас уже есть ...

$hotspot[0]['ath'] = $json_data->xpos;
$hotspot[0]['atv'] = $json_data->ypos;
...