PHP将节点添加到现有的xml文件并保存
问题描述:
是否可以使用php的XMLWriter将新节点插入到现有的xml文件中,然后保存该文件。这对我来说会更有意义,每当我想更新一个xml文件时,实际创建一个enw文件。PHP将节点添加到现有的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函数,同时打开文件进行追加。
答
$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");
这工作得很好。您也可以将属性添加到汉堡
大多数XML解析器是否可以很好地理解/处理参考文件以便依赖此解决方案?这种链接节点的想法没有被验证是一个非常安全和理解的想法吗?我可以看到,如果浏览器/客户端/解析器只从引用下游,但是有没有机会防止格式不正确的引用,它需要首先验证整个文档?还是只需要在主XML文档的上下文中有效? – Anthony 2010-03-15 21:09:44
我不知道很多XML解析器知道“大多数”解析器是否支持实体扩展。我主要使用PHP和PHP XML解析器(一个xmllib的包装器)支持它。收录之后,整份文件必须完整。我会编辑我的答案以反映这一点。 – chiborg 2010-03-16 08:21:21