我需要使用Simple XML加载XML源,与他的所有子项复制现有节点,然后在呈现XML之前自定义此新节点的属性。有什么建议吗?
答案 0 :(得分:20)
SimpleXML无法执行此操作,因此您必须使用DOM。好消息是DOM和SimpleXML是同一枚硬币libxml的两面。所以无论你是使用SimpleXML还是DOM,你都在使用同一棵树。这是一个例子:
$thing = simplexml_load_string(
'<thing>
<node n="1"><child/></node>
</thing>'
);
$dom_thing = dom_import_simplexml($thing);
$dom_node = dom_import_simplexml($thing->node);
$dom_new = $dom_thing->appendChild($dom_node->cloneNode(true));
$new_node = simplexml_import_dom($dom_new);
$new_node['n'] = 2;
echo $thing->asXML();
如果你做了很多这样的事情,你可以尝试SimpleDOM,这是SimpleXML的扩展,它允许你直接使用DOM的方法,而不需要转换为DOM对象。
include 'SimpleDOM.php';
$thing = simpledom_load_string(
'<thing>
<node n="1"><child/></node>
</thing>'
);
$new = $thing->appendChild($thing->node->cloneNode(true));
$new['n'] = 2;
echo $thing->asXML();
答案 1 :(得分:3)
使用SimpleXML,我发现的最佳方法是解决方法。它很漂亮,但它确实有效:
// Strip it out so it's not passed by reference
$newNode = new SimpleXMLElement($xml->someNode->asXML());
// Modify your value
$newnode['attribute'] = $attValue;
// Create a dummy placeholder for it wherever you need it
$xml->addChild('replaceMe');
// Do a string replace on the empty fake node
$xml = str_replace('<replaceMe/>',$newNode->asXML(),$xml->asXML());
// Convert back to the object
$xml = new SimpleXMLElement($xml); # leave this out if you want the xml
由于这是SimpleXML中似乎没有的功能的解决方法,因此您需要注意我希望这会破坏您到目前为止所定义的任何对象引用(如果有的话)。 / p>