我们为PHP使用什么XML解析器?
我喜欢XMLReader类,因为它具有简单性和速度。但是我喜欢xml_parse关联的函数,因为它可以更好地进行错误恢复。如果XMLReader类将引发诸如无效实体引用之类的异常,而不仅仅是发出警告,那将是很好的。
解决方案
回答
SimpleXML似乎对我来说做得很好。
回答
我主要还是坚持使用SimpleXML,至少在我可以使用PHP5的时候。
http://www.php.net/simplexml
回答
如果可以的话,我会避免使用SimpleXML。尽管通过避免使用很多"丑陋的"代码看起来很诱人,但顾名思义,它就是:简单。例如,它无法处理此问题:
<p> Here is <strong>a very simple</strong> XML document. </p>
咬一下子弹,然后转到DOM功能。它的功能远远超过了额外的复杂性。如果我们完全熟悉Javascript中的DOM操作,那么使用此库将使我们感到宾至如归。
回答
使用PHP5解析XML文件时,至少有四个选项。最佳选择取决于XML文件的复杂性和大小。
在IBM developerWorks上有一个非常好的三部分文章系列,标题为PHP开发人员XML。
现在完全符合W3C标准的DOM解析是一种常见的选择,并且是复杂但相对较小的文档的选择。 SimpleXML是处理基本的和不太大的XML文档的方式,并且XMLReader比SAX更加容易和快捷,是大型文档的首选流解析器。
回答
SimpleXML和DOM无缝地协同工作,因此我们可以使用与SimpleXML或者DOM相同的XML进行交互。
例如:
$simplexml = simplexml_load_string("<xml></xml>"); $simplexml->simple = "it is simple."; $domxml = dom_import_simplexml($simplexml); $node = $domxml->ownerDocument->createElement("dom", "yes, with DOM too."); $domxml->ownerDocument->firstChild->appendChild($node); echo (string)$simplexml->dom;
我们将得到结果:
"yes, with DOM too."
因为当我们导入对象(导入到simplexml或者dom中)时,它通过引用使用相同的带下划线的PHP对象。
当我尝试通过扩展/包装对象来纠正SimpleXML中的某些错误时,我发现了这一点。
有关示例,请参见http://code.google.com/p/blibrary/source/browse/trunk/classes/bXml.class.inc。
这对于XML较小的块(-2MB)确实非常有用,因为DOM / SimpleXML会将整个文档以一些额外的开销(例如x2或者x3)拉入内存。对于较大的XML块(+ 2MB),我们将希望使用XMLReader / XMLWriter来解析SAX样式,而内存开销较低。我已经使用XMLReader / XMLWriter成功使用了14MB以上的文档。