我有一个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查询来获取//*B
,child2==data2
和child4==data4
,如下所示:
$query = "//*[@ID=444]//*['data2' and 'data4']";
$result = $xml->xpath($query);
它工作正常。但现在,我想在找到匹配后更新data1
和data3
,仅使用simplexml API。这就是我所做的,但它无法正常工作:
if(!empty($result)){
$result[0]['data2'] = "Blabla";
$result[0]['data4'] = "Blaaaaaaaa";
return $xml->saveXML($File;
}
我做错了什么?或者如何用simplexml更好地完成?任何想法都将不胜感激。
答案 0 :(得分:1)
我做了一个XPath查询来获取
//*B
,child2==data2
和child4==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);