PHP将节点添加到现有的xml文件并保存

问题描述:

是否可以使用php的XMLWriter将新节点插入到现有的xml文件中,然后保存该文件。这对我来说会更有意义,每当我想更新一个xml文件时,实际创建一个enw文件。PHP将节点添加到现有的xml文件并保存

您可以使用PHP的Simple XML。您必须阅读文件内容,使用Simple XML添加节点并将内容写回。

我会用simplexml来代替。我要走出去,假设如果你有XML编写器,你也有simplexml。

让我们来看看,添加一个节点,我们假设一个非常简单的XML文件(得到它?):

<desserts> 
    <cakes> 
     <cake>chocolate</cake> 
     <cake>birthday</cake> 
    </cakes> 
    <pies> 
     <pie>apple</pie> 
     <pie>lemon</pie> 
    </pies> 
</desserts> 

如果这是一个文件,要添加一个新的馅饼,你会做:

$desserts = new SimpleXMLElement; 

$desserts->loadfile("desserts.xml"); 

$desserts->pies->addChild("pie","pecan"); 

它当然可以比这更复杂。但是一旦你掌握了它,它是非常有用的。

这里的一般问题是格式良好的XML文档必须只有一个根元素。这意味着您必须在完整的文档树中读取/解析才能添加新元素。因此,这里的所有simplexml建议。

XMLWriter用于非常有效地写入XML数据流,但不能修改现有文件(不先读取它们)。

请参阅perlmonks.com上的此线程讨论XML日志文件。特别有趣的是“mirod”的评论,它显示了如何拥有一个格式良好的XML文件,并且仍然能够将节点添加到文档中。解决方案是将任意节点放在一个单独的文件中(由于根元素混乱而无法自行完成),并将该文件作为外部实体引用。在你的情况下,你需要编写一个文件作为一个实体包含标准的PHP fopen,fwrite fclose函数,同时打开文件进行追加。

+0

大多数XML解析器是否可以很好地理解/处理参考文件以便依赖此解决方案?这种链接节点的想法没有被验证是一个非常安全和理解的想法吗?我可以看到,如果浏览器/客户端/解析器只从引用下游,但是有没有机会防止格式不正确的引用,它需要首先验证整个文档?还是只需要在主XML文档的上下文中有效? – Anthony 2010-03-15 21:09:44

+0

我不知道很多XML解析器知道“大多数”解析器是否支持实体扩展。我主要使用PHP和PHP XML解析器(一个xmllib的包装器)支持它。收录之后,整份文件必须完整。我会编辑我的答案以反映这一点。 – chiborg 2010-03-16 08:21:21

$xml_doc = new DomDocument; 

$xml_doc->Load('yourfilename.xml'); 

$desserts = $xml_doc->getElementsByTagName('desserts')->item(0); 

$burger =$xml_doc->createElement('burger'); 

$desserts->appendChild($burger); 

$done = $xml_doc->save("yourfilename.xml"); 

这工作得很好。您也可以将属性添加到汉堡