决定是否使用DOM,SAX或XPath的因素

时间:2010-06-22 12:44:50

标签: c xml libxml2

我的代码中有一种奇怪的情况。我正在编写一个Apache模块,需要在响应文档的head标签中添加注释(除了做一些其他不重要的事情)。

在我需要解析响应文档的时候,我将整个文档以char *缓冲区的形式存储在内存中(我正在使用C)。所以我不太确定选择哪种API?

我知道DOM,会在文件的内存树表示中创建自己的DOM。我可以通过释放早期的缓冲区来节省一些内存空间。

SAX:我真的不太了解它。

XPath-因为我搜索过,我相信它只能用于检索元素值。如果这是真的,那么我没有使用它。

给我一​​些见解,最适合当前情况的是什么?

3 个答案:

答案 0 :(得分:1)

DOM和SAX是“解析数据的方法”。 DOM解析整个文档并生成数据结构。 SAX解析文档“逐个元素”,让你知道什么时候遇到一些有趣的东西,并期待你处理它。

XPath是一种在DOM文档中引用数据的方法。即,说“第一个节点”等。它非常强大和精彩,但不用于解析。

就易用性而言,DOM非常优越。但是,在许多情况下它会慢很多并占用更多内存。

对我来说,我考虑的事情是基于使用DOM的缓慢和内存膨胀是否会影响我的应用程序:

  • 我是否正在解析非常大的文档?
  • 我解析了很多很多东西吗?
  • 速度真的重要吗?

另外值得注意的是,如果您选择使用DOM,请确保您研究那些库。一个坏的库可能比一个好的库慢10到100倍。

答案 1 :(得分:1)

关于DOM vs SAX,请记住DOM会增加处理的延迟。

DOM更容易,因为它会自动创建一个结构。在此结构中,您将添加所需的数据,然后您将能够从具有DOM的结构生成char *缓冲区。但是你要意识到在添加数据之前需要完全创建结构,然后才能将它转换回char *来发送它。这是添加延迟的地方。

使用SAX是更多的工作。您在XML到达时处理它。您甚至不必等待完整的char *数据来开始处理它。一旦元素启动,您就会检测到文档中的位置,并且您可以即时注入其他数据。添加的延迟非常少,并且没有数据重复。

我对XPath知之甚少,但它对解析没用。

答案 2 :(得分:1)

在使用XML(或HTML)和Apache方面,如果您正在做足够简单的事情,例如在文档中的特定位置插入注释,那么使用XSL可能会更有效。这本身处理XML样式的文档,其中HTML和XHTML是子集,无需将它们转换为其他格式以便更容易地与其他编程语言一起工作。另一方面,DOM和SAX解析分别以一种易于处理的方式考虑XML文档,或者通过将其转换为特定语言的本机对象,或者注册代码可以处理的“事件”。

关于XSL的更多信息,请查看http://www.w3schools.com/xsl/

另外一个想法 - 如果你真的在做一些基本的事情,比如在头部添加注释,那么使用SAX解析比使用DOM解析更有效,因为简单编辑不需要解析整个文档。通过等待到达“head”元素的正确事件然后添加你想要的任何东西,它会更优雅地处理。