我正在测试PHP中的各种方法来读取(可能很大,频繁读取)XML配置文件。不需要写作。我有两个成功的实现,一个使用 SimpleXML (我知道是一个DOM解析器),另一个使用 XMLReader 。
我知道DOM读取器必须读取整个树,因此使用更多内存。我的测试反映了这一点我也知道SAX解析器是一个“基于事件”的解析器,它使用较少的内存,因为它从流中读取每个节点而不检查下一个是什么。
XMLReader还使用游标从流中读取,提供有关其当前所在节点的数据。所以,听起来像XMLReader(http://us2.php.net/xmlreader)不是是一个DOM解析器,但我的问题是,它是SAX解析器还是别的?看起来XMLReader的行为与SAX解析器的行为相似,但不会自行抛出事件(换句话说,您可以使用XMLReader构建SAX解析器吗?)
如果是其他内容,它所在的分类是否有名称?
答案 0 :(得分:5)
XMLReader calls itself a "pull parser."
XMLReader扩展是一个XML Pull解析器。读取器在文档流上作为光标前进,并在途中停在每个节点上。
后来接着说它使用了libxml。
This page on Java XML Pull Parsing可能有一些可能的兴趣。如果XMLReader与此项目的目标和意图相关,那么您的问题的答案完全属于“不”类别。
答案 1 :(得分:4)
SAX解析器是一个实现SAX API的解析器。也就是说:当且仅当您可以使用SAX API对其进行编码时,给定的解析器才是SAX解析器。对于DOM解析器也是如此:这种分类完全是关于它支持的API,而不是API的实现方式。因此,SAX解析器也可能是一个DOM解析器;因此,你不能确定使用更少的内存或其他特性。
然而,要找到真正的问题:XMLReader似乎是更好的选择,因为它是一个拉解析器,您可以非常具体地请求您想要的数据,因此应该减少开销。
答案 2 :(得分:1)
XMLReader
是SAX2解析器必须实现的接口。因此,当您通过XMLReader
访问它时,可以说您有SAX解析器,简而言之XMLReader
是SAX解析器。
XMLReader是XML解析器的SAX2驱动程序必须实现的接口。此接口允许应用程序在解析器中设置和查询功能和属性,注册事件处理程序以进行文档处理,以及启动文档解析。
我认为这些信息是相关的,因为:
答案 3 :(得分:1)
简而言之,它既不是。
SAX解析器是面向流的,基于事件的推送解析器。注册回调函数来处理诸如startElement和endElement之类的事件,然后调用parse()来处理整个XML文档,一次一个节点。据我所知,PHP没有维护良好的SAX解析器。但是,有XMLParser,它使用非常相似的Expat库。
DOM解析器要求您将整个XML文档加载到内存中,但它们提供了XML节点的面向对象树。 PHP中的DOM解析器示例包括SimpleXML和DOM。
PHP XMLReader不是这些。它是一个面向流的“拉解析器”,它要求您创建一个大循环并调用read()函数以向前移动光标,一次处理一个节点。
XMLParser和XMLReader与SimpleXML和DOM的最大好处是面向流的解析器具有内存效率,只将当前节点加载到内存中。另一方面,SimpleXML和DOM更易于使用,但它们要求您将整个XML文档加载到内存中,这对于非常大的XML文档来说是不利的。