2009-12-01 140 views
4

的孩子,我有类似以下内容的XML设置此SimpleXMLElement对象...添加XML块作为SimpleXMLElement对象

$xml = <<<EOX 
<books> 
    <book> 
     <name>ABCD</name> 
    </book> 
</books> 
EOX; 

$sx = new SimpleXMLElement($xml); 

现在我有一个类名为书包含的信息。关于每本书。同一个班级也可以吐出图书信息。在XML格式的类似上述(嵌套块)..例如,

$book = new Book('EFGH'); 
$book->genXML(); 

... will generate 
<book> 
    <name>EFGH</name> 
</book> 

现在,我试图找出一个办法让我可以用这个生成的XML块,并追加为使孩子现在看起来...例如..

// Non-existent member method. For illustration purposes only. 
$sx->addXMLChild($book->genXML());  

...XML tree now looks like: 
<books> 
    <book> 
     <name>ABCD</name> 
    </book> 
    <book> 
     <name>EFGH</name> 
    </book> 
</books> 

从什么文件我已经在读的SimpleXMLElement,的addChild()不会得到这个工作对你,因为它不支持XML数据作为标签值。

+0

相关:[有没有办法将PHP SimpleXMLElement添加到另一个SimpleXMLElement?](http://stackoverflow.com/q/1157104/367456) – hakre 2013-04-27 10:25:31

回答

4

两种解决方案。首先,你的libxml/DOM文档/的SimpleXML的帮助下做到这一点:你必须输入你的$sx对象DOM,创建DOMDocumentFragment和使用DOMDocumentFragment::appendXML()

$doc = dom_import_simplexml($sx)->ownerDocument; 

$fragment = $doc->createDocumentFragment();  
$fragment->appendXML($book->genXML()); 
$doc->documentElement->appendChild($fragment); 

// your original $sx is now already modified. 

Online Demo

您还可以从SimpleXMLElement扩展并添加一个提供此操作的方法。使用这种专门的对象,然后将允许您创建轻松以下几点:

$sx = new MySimpleXMLElement($xml); 

$sx->addXML($book->genXML()); 

另一种解决方案是使用已经有这个功能内置在像SimpleDOM的XML库。您抓取SimpleDOM,并使用insertXML(),它与您所描述的addXMLChild()方法一样工作。

include 'SimpleDOM.php'; 

$books = simpledom_load_string(
    '<books> 
     <book> 
      <name>ABCD</name> 
     </book> 
    </books>' 
); 

$books->insertXML(
    '<book> 
     <name>EFGH</name> 
    </book>' 
); 
+0

我会去第一种方法,因为它不涉及任何外部库。仔细研究了代码并设法弄清楚了确切的代码序列。谢谢。这有助于bigtime :) – 2009-12-01 09:00:36

+0

如果你还有它,请用精确的代码顺序贡献......! – maralbjo 2010-05-01 12:13:21

+0

嗨,孩子们,我添加了一个代码示例,说明这是如何工作的,包括在线演示。我不知道为什么这个问题在过去三年半没有提供,因为这个问答显示了一个基本和有用的概念。你们都可能有超级密码;) - 是的,现在* SimpleDOM *在我眼中完全是多余的。 – hakre 2013-04-27 07:08:39

3

看一看我的代码:

$doc = new DOMDocument();  
$doc->loadXML("<root/>");  

$fragment = $doc->createDocumentFragment();  
$fragment->appendXML("<foo>text</foo><bar>text2</bar>"); 
$doc->documentElement->appendChild($fragment); 

echo $doc->saveXML(); 

这通过添加XML片段修改XML文档。 Online Demo

+1

你的代码很好,并且可以正常工作:http://eval.in/17709 - 现在就删除关于保存的部分,你只需要修改一个XML,与存储到磁盘中的不相关的问题应该放在另一个问题上。 – hakre 2013-04-27 06:51:10

+0

@hakre saveXML返回一个字符串,它并不实际将其保存到磁盘。 – oskarth 2013-09-26 10:30:11