你在PHP中使用哪个XML解析器?

3

我喜欢 XMLReader 类,因为它简单快速。但是我更喜欢与 xml_parse 相关的函数,因为它更好地支持错误恢复。如果 XMLReader 类可以像抛出异常那样处理无效实体引用等问题,那就太好了。

5个回答

4

如果可以的话,我建议你避免使用SimpleXML。虽然它看起来非常诱人,可以避免很多“丑陋”的代码,但正如其名称所示:“简单”。例如,它无法处理这种情况:

<p>
    Here is <strong>a very simple</strong> XML document.
</p>

要涉及it技术,就必须掌握DOM函数。虽然它稍微有点复杂,但其强大的功能远远超过了这点复杂度。如果你对JavaScript中的DOM操作有所了解,那么你将会非常容易上手使用这个库。


1
说真的,这绝不是一个不使用SimpleXML的合理理由。如果你正在使用php5......和有效的xml,那么SimpleXML就是解决方案。 - dawnerd
2
@Mark - 你确定吗?将我的示例粘贴到验证器中,它可以工作。(http://www.validome.org/xml/validate/)。该元素的DTD如下所示:<!ELEMENT p (#PCDATA | strong)*>。 - nickf
是的,它确实让我有一段时间开始怀疑自己。 - nickf
我知道这是一个非常老的问题,但我很想知道SimpleXML在解析这个问题时失败了吗? - Nicole
@Renesis - $xml->p 返回的值是 "Here is XML document"children() 函数只返回 <strong> 元素,而不是文本节点,如果要构建上述文档,就必须切换到 DOM 函数。 - nickf
显示剩余5条评论

3

简单XML在处理1.5GB的文件时表现如何? - mike
我不知道XML在1.5GB的文件上表现如何。使用数据库? - nickf
客户向我们提供的文件非常大,我们必须进行解析。 - mike
个人从未处理过如此大的文件,但是SimpleXML似乎会将整个文件加载到内存中,对于您的情况可能会有很大的缺点。对于那么大的文件来说,XML可能不是最优的存储格式。这个文件包含什么内容? - Chris Cherry

2
SimpleXML和DOM可以无缝地一起工作,因此您可以使用相同的XML来与其交互,既可以使用SimpleXML也可以使用DOM。
例如:
$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 +的文档。

1

使用PHP5解析XML文件时,至少有四种选项。最佳选择取决于XML文件的复杂程度和大小。

IBM developerWorks有一套非常不错的三部分文章系列,标题为“XML for PHP developers”。

“使用DOM解析器解析XML,现在已经完全符合W3C标准,这是常见的选择,并且适用于复杂但相对较小的文档。SimpleXML适用于基本且不太大的XML文档,而XMLReader比SAX更易于操作和更快速,是处理大型文档的首选流解析器。”


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接