如果节点与 Xpath 一起存在,则修改属性?

Posted

技术标签:

【中文标题】如果节点与 Xpath 一起存在,则修改属性?【英文标题】:Modify attribute if node exist with Xpath? 【发布时间】:2019-04-11 21:29:25 【问题描述】:

如果节点存在,我正在尝试修改节点属性,如果不存在,则使用 Xpath 在 xml 文件中创建它。 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】:

你不能用 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;

【讨论】:

请考虑将此(以及您的任何其他问题)标记为已回答 - meta.stackexchange.com/questions/5234/…

以上是关于如果节点与 Xpath 一起存在,则修改属性?的主要内容,如果未能解决你的问题,请参考以下文章

如果 mkdir 不存在,则使用 golang

XPath 运算符

XPath 查找节点是不是存在

检查节点是不是存在,如果不存在则创建

如果不存在,则通过将 spring Jpa 与 hibernate 一起使用来创建模式

与具有多个文本子节点的节点一起使用时,XPath contains(text(),'some string') 不起作用