使用SimpleXML API更新XML节点值

时间:2015-01-06 10:40:39

标签: php xml xpath simplexml

我有一个XML结构:

<root>
   <!-- ... -->
   <B ID="444">
        <C></C>  
        <D>Anything</D>
        <E>
            <child1 /*expected outcome came in here*/> /*sometimes here*/ </child1>
            <child2>data2 <!-- instead of here --></child2>
            <child3>data3</child3>
            <child4>data4 /* and also here instead*/ </child4>
        </E>
    </B>
   <!-- ... -->
</root>

我做了一个XPath查询来获取//*Bchild2==data2child4==data4,如下所示:

$query = "//*[@ID=444]//*['data2' and 'data4']";
$result = $xml->xpath($query);

它工作正常。但现在,我想在找到匹配后更新data1data3,仅使用simplexml API。这就是我所做的,但它无法正常工作:

if(!empty($result)){
    $result[0]['data2'] = "Blabla";
    $result[0]['data4'] = "Blaaaaaaaa";
    return $xml->saveXML($File;
}

我做错了什么?或者如何用simplexml更好地完成?任何想法都将不胜感激。

1 个答案:

答案 0 :(得分:1)

  

我做了一个XPath查询来获取//*Bchild2==data2child4==data4,如下所示:

$query = "//*[@ID=444]//*['data2' and 'data4']";

那已经错了。您认为您的尝试将child2'data2'child4'data4'进行比较的位置在哪里?

更好:

$query = "//B[@ID = 444 and .//child2 = 'data2' and .//child4 = 'data4']";
$result = $xml->xpath($query);

foreach ($result as $b) {
    // find first <child2> and <child4> descendants
    $child2 = $b->xpath(".//child2")[0];
    $child4 = $b->xpath(".//child4")[0];

    // set their text values
    $child2[0] = "Blabla";
    $child4[0] = "Blaaaaaaaa";
}

return $xml->saveXML($File);

请参阅http://ideone.com/lXtvbP