如何更改特定的xml标记值,其中标记具有id。用php

时间:2016-03-01 14:08:36

标签: php xml

我正在尝试使用php更改xml文件中的值。我正在使用php将xml文件加载到这样的对象中..

if(file_exists('../XML/example.xml')) {
            $example = simplexml_load_file('../XML/example.xml');
        }
else {
exit ("can't load the file");
}

然后一旦它被加载我通过为它们分配另一个变量的内容来改变标签内的值,就像这样......

$example->first_section->second_section->third_section->title = $var['data'];

然后,一旦我进行了必要的更改,文件就会被保存。到目前为止,这个过程运作良好,但现在已经遇到了绊脚石。

我想在我的xml文件中更改特定标记内的值,该文件具有id。在XML文件中,它看起来像这样。

<first_section>
     <second_section>
          <third_section id="2">
               <title>Mrs</title>
          </third_section>
     </second_section>
 </first_section>

如何使用与我一直使用的语法类似的语法更改此值?

做..

$example->first_section->second_section->third_section id="2" ->title = $var['data']

不起作用,因为语法错误。

我一直在扫描堆栈溢出,并在整个网络中以这种方式执行此操作,但是显示为空。

是否可以像这样定位和更改xml中的值,还是需要更改我修改此文件的方式?

感谢。

2 个答案:

答案 0 :(得分:1)

您提供的XML的某些虚拟代码肯定不是原始代码。

$xml = simplexml_load_file('../XML/example.xml');
$section = $xml->xpath("//third_section[@id='2']")[0];
// runs a query on the xml tree
// gives always back an array, so pick the first one directly
$section["id"] = "3";

// check if it has indeed changed
echo $xml->asXML();

正如@Muhammed M.已经说过,请查看SimpleXML documentation以获取更多信息。检查相应的demo on ideone.com

答案 1 :(得分:0)

在经过多次搞乱后弄清楚我们。感谢您的贡献,我确实需要使用Xpath。然而,它不适合我的原因是因为我没有指定我想编辑的节点的整个路径。

例如,将xml文件加载到对象($ xml)后:

    foreach($xml->xpath("/first_section/second_section/third_section[@id='2']") as $entry ) {   
        $entry->title = "mr"; 
    }

这将起作用,因为节点的整个路径都包含在括号中。 但在上面的例子中,例如:

        foreach($xml->xpath("//third_section[@id='2']" as $entry ) {    
        $entry->title = "mr";

        }

这不会起作用,即使我理解双//将使其向下钻取,我假设xpath将搜索整个xml结构并返回id = 2的位置。经过几个小时的测试,这似乎并非如此。您必须包含节点的完整路径。我一做到这一点就行了起来。 另外还有一个注意事项。 $ section = $ xml-&gt; xpath(&#34; // third_section [@id =&#39; 2&#39;]&#34;)[0]; 是不正确的语法。您不需要指定索引&#34; [0]&#34;在末尾。包括它标记Dreamweavers语法检查器。忽略Dreamweaver并上传无论如何都会破坏代码。所有你需要的是.. $ section = $ xml-&gt; xpath(&#34;此处节点的完整路径[@id =&#39; 2&#39;]&#34;);

感谢您帮助并建议xpath。它非常有效......一旦你知道如何使用它。