【问题标题】:Select node based on attribute and change subnode根据属性选择节点并更改子节点
【发布时间】:2015-10-26 03:54:32
【问题描述】:

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

尝试了不同的解决方案,但似乎不起作用。

【问题讨论】:

    标签: php xml simplexml


    【解决方案1】:

    您的语句$xml-&gt;programme[1]-&gt;rating_point 没有选择属性为id="1"&lt;programme&gt; 节点。
    它指的是 XML 中的第二个 &lt;programme&gt; 节点,无论其 id 属性如何。

    基本上有两种方法可以到达&lt;programme id="1"&gt;

    $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 选择 xpath:

    $item = $xml->xpath("//programme[@id='$id']")[0];
    
    if (!is_null($item)) {
        $item->rating_point = $rating;
        if ($rating == 5) $item->five_star = $rating;
    } 
    

    评论:

    • //programme:选择每个 &lt;programme&gt; 节点,无论在 XML 树中的什么位置
    • [@id='1']:一个条件,@是属性
    • xpath 函数返回一个包含SimpleXML 元素的数组,[0] 我们抓取该数组中的第一个元素并将其放入$item

    看到它的工作:https://eval.in/458310

    如您所见,解决方案 #2 更快,如果您的 XML 包含多个 &lt;programme&gt; 节点,则更是如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多