我在这里发现了很多关于如何使用XPath获取具有指定id的节点,并使用SimpleXMLElement :: asXML写下数据。
但是可以使用XPath在具有特定id
的节点中编写数据,而不是foreach
方法吗?
这就是我所拥有的
<people>
<person>
...
</person>
<person id="17">
<name>John</name>
</person>
<person>
...
</person>
</people>
我看起来像是:
$xml->person['id=17']->name = Bill;
或
$xml->xpath('/person[@id=17]')->name = Bill;
然后
$xml->asXML(data.xml);
答案 0 :(得分:0)
正如@Passerby指出的那样,the ->xpath()
method会返回一个数组,所以最简单的方法是使用foreach
(demo)循环它:
$nodes=$xml->xpath('//person[@id=17]');
foreach($nodes as $node)
{
$node->name="Bill";
}
这些对象都链接回原始的SimpleXML解析结构,因此将整个事物保存回XML将反映任何更改。
由于我们知道在这种情况下XPath的结果只有一个元素,修改$nodes[0]
也有效 - 尽管要注意如果找到 no 节点会发生什么( demo):
$nodes=$xml->xpath('//person[@id=17]');
$nodes[0]->name="Bill";
最简洁的版本只适用于PHP 5.4,你可以直接在函数返回值上使用数组下标,将上面的内容压缩到一行 - 再次,只有在你确定找到元素时才使用它({ {3}}):
$xml->xpath('//person[@id=17]')[0]->name="Bill";