使用libxml SAX解析HTML片段

时间:2010-05-14 09:53:02

标签: html c sax libxml2

我需要解析HTML片段,我的意思是文件缺少< html>,< head>和< body>元素,否则具有格式良好的XHTML语法,保证UTF8编码。看起来libxml非常适合这项任务,但是我有一些我不知道如何实现的约束。

  1. htmlSAXParseFile()完成它的工作,但它似乎创建了DOM本身,在进程中插入了 body html 元素。我想自己创建DOM,因为我可能需要跳过一些元素并动态修改其他元素。有可能以某种方式告诉libxml 根本不创建DOM 而只是解析HTML并调用我的处理程序吗?
  2. 如果这对于libxml HTML解析器是不可能的,我不妨使用似乎不创建DOM的xmlSAXUserParseFile()。但是,由于文件的结构类似于< p> ...< / p>< p> ...< / p>,解析器过早地吐出“文档末尾的额外内容” 。有没有办法抑制一些解析错误,同时仍然得到有关它们的通知(只是因为没有人保证这些文件中永远不会有其他错误)?
  3. 在libxml中解析函数有一大堆,其中一些函数接受xmlParserOption作为参数。唉,xmlSAXUserParseFile()没有。那些完成所有这些似乎都是为了一些不相关的API设计原因而创建DOM。我错过了一个明显的候选人吗?
  4. 哦,我承认我不愿意使用libxml的DOM看起来像个怪癖。我非常受限于RAM,因此我迫切需要对DOM进行全面控制才能在低内存条件下丢弃某些节点并在必要时重新读取它们。

    提前致谢。

1 个答案:

答案 0 :(得分:6)

好的,既然没有人回答这个问题,我会尝试自己做。

我编写了所有的start / end元素处理程序,看起来libxml不再创建DOM了。至少,返回的文档指针为NULL。它仍然坚持HTML和身体元素,但我可以忍受。

一个主要问题是libxml保留所有空白节点,无论如何。所以我必须解析文本内容以消除可忽略的空白。这很难看,但它确实有效。我是否应该提到解析UTF-8是一种你很少想念的乐趣?

老实说,libxml文档非常糟糕。我建议任何尝试阅读文档的人:改为阅读源代码。代码更具可读性和文档记录。

感谢您的关注。