Select 基于属性的节点和更改子节点
Select node based on attribute and change subnode
我有以下 XML 文件:
<?xml version="1.0" encoding="UTF-8"?>
<programmedata>
<programme id="1">
<name>Left</name>
<image_path></image_path>
<rating_point>0</rating_point>
<five_star>0</five_star>
使用以下代码,我正在尝试编辑 rating_point 的值:
$xml=simplexml_load_file("content.xml");
if(!empty($_POST["rating"]) && !empty($_POST["voted_programme"])){
try{
$rating = $_POST["rating"];
$i = $_POST['voted_programme'];
$xml->programme[$i]->rating_point = $rating;
if($rating == '5')
{
$xml->programme[$i]->five_star = $rating;
}
但出现错误:
Notice: Indirect modification of overloaded element of SimpleXMLElement has no effect in ...
尝试了不同的解决方案,但似乎不起作用。
您的语句 $xml->programme[1]->rating_point
不 select <programme>
具有属性 id="1"
.
的节点
它指的是您的 XML 中的第二个 <programme>
节点,无论其 id
属性如何。
基本上有两种方法可以到达<programme id="1">
:
$xml = simplexml_load_string($x); // assume XML in $x
$rating = 5;
$id = 1;
#1 循环整个 XML
foreach ($xml->programme as $item) {
if ($item[`id`] == $id) {
$item->rating_point = $rating;
if ($rating == 5) $item->five_star = $rating;
}
}
评论:参见第 2 行 (if...
) 如何访问属性。
看到它工作:https://eval.in/458300
#2 select 与 xpath
:
$item = $xml->xpath("//programme[@id='$id']")[0];
if (!is_null($item)) {
$item->rating_point = $rating;
if ($rating == 5) $item->five_star = $rating;
}
评论:
//programme
:select 每个 <programme>
节点,在 XML 树 中的任何位置
[@id='1']
:一个条件,@
是针对属性
-
xpath
函数 returns 一个 SimpleXML
元素的数组,使用 [0]
我们获取该数组中的第一个元素并将其放入 $item
.
看到它工作:https://eval.in/458310
如您所见,解决方案 #2 更快,如果您的 XML 包含多个 <programme>
节点,则更是如此。
我有以下 XML 文件:
<?xml version="1.0" encoding="UTF-8"?>
<programmedata>
<programme id="1">
<name>Left</name>
<image_path></image_path>
<rating_point>0</rating_point>
<five_star>0</five_star>
使用以下代码,我正在尝试编辑 rating_point 的值:
$xml=simplexml_load_file("content.xml");
if(!empty($_POST["rating"]) && !empty($_POST["voted_programme"])){
try{
$rating = $_POST["rating"];
$i = $_POST['voted_programme'];
$xml->programme[$i]->rating_point = $rating;
if($rating == '5')
{
$xml->programme[$i]->five_star = $rating;
}
但出现错误:
Notice: Indirect modification of overloaded element of SimpleXMLElement has no effect in ...
尝试了不同的解决方案,但似乎不起作用。
您的语句 $xml->programme[1]->rating_point
不 select <programme>
具有属性 id="1"
.
的节点
它指的是您的 XML 中的第二个 <programme>
节点,无论其 id
属性如何。
基本上有两种方法可以到达<programme id="1">
:
$xml = simplexml_load_string($x); // assume XML in $x
$rating = 5;
$id = 1;
#1 循环整个 XML
foreach ($xml->programme as $item) {
if ($item[`id`] == $id) {
$item->rating_point = $rating;
if ($rating == 5) $item->five_star = $rating;
}
}
评论:参见第 2 行 (if...
) 如何访问属性。
看到它工作:https://eval.in/458300
#2 select 与 xpath
:
$item = $xml->xpath("//programme[@id='$id']")[0];
if (!is_null($item)) {
$item->rating_point = $rating;
if ($rating == 5) $item->five_star = $rating;
}
评论:
//programme
:select 每个<programme>
节点,在 XML 树 中的任何位置
[@id='1']
:一个条件,@
是针对属性-
xpath
函数 returns 一个SimpleXML
元素的数组,使用[0]
我们获取该数组中的第一个元素并将其放入$item
.
看到它工作:https://eval.in/458310
如您所见,解决方案 #2 更快,如果您的 XML 包含多个 <programme>
节点,则更是如此。