我有两个XML树,并希望将一棵树作为叶子添加到另一棵树中。
显然:
$tree2->addChild('leaf', $tree1);
不起作用,因为它只复制第一个根节点。
好的,那么我想我会遍历整个第一棵树,将每一个元素逐一添加到第二棵树。
但请考虑这样的XML:
<root>
aaa
<bbb/>
ccc
</root>
如何访问“ccc”? tree1->children()
只返回“bbb”......
答案 0 :(得分:26)
如您所见,您无法直接使用SimpleXML添加“树”。但是,您可以使用一些DOM方法为您完成繁重的工作,同时仍然使用相同的基础XML。
$xmldict = new SimpleXMLElement('<dictionary><a/><b/><c/></dictionary>');
$kitty = new SimpleXMLElement('<cat><sound>meow</sound><texture>fuzzy</texture></cat>');
// Create new DOMElements from the two SimpleXMLElements
$domdict = dom_import_simplexml($xmldict->c);
$domcat = dom_import_simplexml($kitty);
// Import the <cat> into the dictionary document
$domcat = $domdict->ownerDocument->importNode($domcat, TRUE);
// Append the <cat> to <c> in the dictionary
$domdict->appendChild($domcat);
// We can still use SimpleXML! (meow)
echo $xmldict->c->cat->sound;
答案 1 :(得分:11)
您可以将此类用于接受子附加的SimpleXML对象
<?php
class MySimpleXMLElement extends SimpleXMLElement
{
/**
* Add SimpleXMLElement code into a SimpleXMLElement
*
* @param MySimpleXMLElement $append
*/
public function appendXML($append)
{
if ($append) {
if (strlen(trim((string)$append)) == 0) {
$xml = $this->addChild($append->getName());
} else {
$xml = $this->addChild($append->getName(), (string)$append);
}
foreach ($append->children() as $child) {
$xml->appendXML($child);
}
foreach ($append->attributes() as $n => $v) {
$xml->addAttribute($n, $v);
}
}
}
}
答案 2 :(得分:8)
这是PHP manual page评论的好方法(仅使用SimpleXML,而不是DOM):
function append_simplexml(&$simplexml_to, &$simplexml_from)
{
foreach ($simplexml_from->children() as $simplexml_child)
{
$simplexml_temp = $simplexml_to->addChild($simplexml_child->getName(), (string) $simplexml_child);
foreach ($simplexml_child->attributes() as $attr_key => $attr_value)
{
$simplexml_temp->addAttribute($attr_key, $attr_value);
}
append_simplexml($simplexml_temp, $simplexml_child);
}
}
还有使用样本。
答案 3 :(得分:0)
非常好的Theo Heikonnen 轻微调整以使其按照我想要的方式工作
function addsubtree(&$xml1,&$xml2) {// Create new DOMElements from the two SimpleXMLElements $dom1 = dom_import_simplexml($xml1); $dom2 = dom_import_simplexml($xml2); // Import the into the document $dom2 = $dom1->ownerDocument->importNode($dom2, TRUE); // Append the to $dom1->appendChild($dom2); } $xml1 = new SimpleXMLElement('<xml/>'); $xml2 = new SimpleXMLElement('<sub/>'); $xml2->addChild('test','data'); $temp=$xml1->addChild('sub1'); header('Content-type: text/xml'); header('Pragma: public'); header('Cache-control: private'); header('Expires: -1'); addsubtree($temp,$xml2); // We can still use SimpleXML! (meow) echo $xml1->asXML();