好吧,我认为 SimpleXML 没有简单的方法(毕竟它应该很简单)。
一种方法是将 myvalues 节点移至 DOMDocument,在其中添加节点,然后将其替换为 dom 节点。鉴于$myvalues
是你的<myvalues>
SimpleXML 中的节点:
$domMyValues = dom_import_simplexml($myvalues);
$newNode = $domMyValues->ownerDocument->createElement('mynewelement');
//Apply attributes and whatever to $newNode
//find the node that you want to insert it before (from the $domMyValues class
$nodes = $domMyValues->getElementsByTagName('image');
$refNode = null;
foreach ($nodes as $node) {
if ($node->getAttribute('name') == 'img02') {
$refNode = $node;
}
}
$domMyValues->insertBefore($newNode, $refNode);
请注意,无需转换回 SimpleXML,因为对 DOMElement 的任何更改都将自动应用于 SimpleXML 版本...如果找不到,它将自动附加新的子元素$refNode
(因为它不存在等)...
编辑:添加 XPath
将 foreach 块替换为以下内容(功能等效,如果我的查询正确的话):
$xpath = new DOMXpath($domMyValues->ownerDocument);
$elements = $xpath->query('//image[@name="img02"]');
$refNode = $elements->item(0);
Since DOMNodeList::item()
对于不存在的偏移量返回 null,我们甚至不需要检查其中是否有项目。
现在,您可能需要/想要调整 xpath 查询以更加/不具体。这是一个不错的教程 http://www.w3schools.com/xpath/...
Edit 2
我忘记了 xpath 需要一个@
告诉它检查属性的字符。
这是我的工作代码(因为我不知道你的确切架构):
$x = '<?xml version="1.0" ?>
<myvalues>
<images>
<image name="01">Foo</image>
<image name="02">Bar</image>
</images>
</myvalues>';
$dom = new DomDocument();
$dom->loadXML($x);
$xpath = new DOMXpath($dom);
$elements = $xpath->query('//images/image[@name="01"]');
$elements = $xpath->query('//image[@name="01"]');
$elements = $xpath->query('/myvalues/images/image[@name="01"]');