根据属性选择节点并更改子节点

时间:2015-10-26 03:54:33

标签: php xml simplexml

我有以下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 ...

尝试了不同的解决方案,但似乎无法正常工作。

1 个答案:

答案 0 :(得分:0)

您的陈述$xml->programme[1]->rating_point 选择属性为<programme>的{​​{1}}节点。
它引用XML中的第二个id="1"节点,而不管其<programme>属性。

基本上有两种方式可以到达id

<programme id="1">

#1循环整个XML

$xml = simplexml_load_string($x); // assume XML in $x
$rating = 5;
$id = 1;

评论:请参阅第2行(foreach ($xml->programme as $item) { if ($item[`id`] == $id) { $item->rating_point = $rating; if ($rating == 5) $item->five_star = $rating; } } )了解如何访问属性 看它工作:https://eval.in/458300

#2选择if...

xpath

评论:

  • $item = $xml->xpath("//programme[@id='$id']")[0]; if (!is_null($item)) { $item->rating_point = $rating; if ($rating == 5) $item->five_star = $rating; } :选择XML树中的每个//programme节点
  • <programme>:条件,[@id='1']用于属性
  • @函数返回xpath元素数组,SimpleXML我们抓取该数组中的第一个元素并将其放入[0]

看到它有效:https://eval.in/458310

正如您所看到的,解决方案#2更快,如果您的XML包含多个$item节点,则更快。