4

我正在测试各种方法来读取 PHP 中的 XML 配置文件(可能很大,读取非常频繁)。从来不需要写作。我有两个成功的实现,一个使用SimpleXML(我知道它是一个 DOM 解析器),一个使用XMLReader

我知道 DOM 阅读器必须读取整个树,因此会使用更多内存。我的测试反映了这一点。我也知道 SAX 解析器是一个“基于事件”的解析器,它使用更少的内存,因为它从流中读取每个节点而不检查下一个节点。

XMLReader 还使用游标从流中读取,提供有关它当前所在节点的数据。因此,听起来 XMLReader ( http://us2.php.net/xmlreader ) 绝对不是DOM 解析器,但我的问题是,它是 SAX 解析器还是其他什么?看起来 XMLReader 的行为方式与 SAX 解析器的行为方式相同,但不会自己抛出事件(换句话说,您可以使用 XMLReader 构建 SAX 解析器吗?)

如果是别的东西,它所在的分类有名称吗?

4

4 回答 4

6

XMLReader称自己为“拉式解析器”。

XMLReader 扩展是一个 XML Pull 解析器。阅读器充当文档流上的光标,并在途中的每个节点处停止。

后来它继续说它使用libxml

这个关于 Java XML Pull Parsing 的页面可能会引起一些兴趣。如果 XMLReader 与该项目的目标和意图相关,那么您的问题的答案完全属于“两者都不是”类别。

于 2010-06-15T19:47:13.770 回答
4

SAX 解析器是实现 SAX API 的解析器。也就是说:给定的解析器是 SAX 解析器当且仅当您可以使用 SAX API 对其进行编码。对于 DOM 解析器也是如此:这种分类纯粹是关于它支持的 API,而不是如何实现该 API。因此,SAX 解析器也很可能是 DOM 解析器。因此你不能确定使用更少的内存或其他特性。

但是要解决真正的问题:XMLReader 似乎是更好的选择,因为由于它是一个拉式解析器,因此您可以非常明确地请求所需的数据,因此所涉及的开销应该更少。

于 2010-06-15T19:51:03.540 回答
1

XMLReader是 SAX2 解析器必须实现的接口。因此,当您通过 SAX 解析器访问它时,您可以说您拥有一个 SAX 解析器XMLReader,简称XMLReaderSAX 解析器。

请参阅XMLReader 的 javadoc

XMLReader 是 XML 解析器的 SAX2 驱动程序必须实现的接口。该接口允许应用程序在解析器中设置和查询特性和属性,注册用于文档处理的事件处理程序,并启动文档解析。

我认为这些信息是相关的,因为:

  • 来自 SAX 官方网站
  • 即使 javadoc 是针对 Java 的,SAX 也起源于 Java 语言。
于 2011-10-31T05:07:28.380 回答
1

简而言之,两者都不是。

SAX 解析器是面向流的、基于事件的推送解析器。您注册回调函数来处理诸如 startElement 和 endElement 之类的事件,然后调用 parse() 来处理整个 XML 文档,一次一个节点。据我所知,PHP 没有维护良好的 SAX 解析器。但是,有XMLParser,它使用非常相似的Expat库。

DOM 解析器要求您将整个 XML 文档加载到内存中,但它们提供了一个面向对象的 XML 节点树。PHP 中的 DOM 解析器示例包括SimpleXMLDOM

PHP XMLReader不是这些。它是一种面向流的“拉解析器”,需要您创建一个大循环并调用 read() 函数将光标向前移动,一次处理一个节点。

XMLParser 和 XMLReader 与 SimpleXML 和 DOM 相比的最大好处是面向流的解析器具有内存效率,仅将当前节点加载到内存中。另一方面,SimpleXML 和 DOM 更易于使用,但它们要求您将整个 XML 文档加载到内存中,这对于非常大的 XML 文档是不利的。

于 2013-02-12T01:22:16.713 回答