3

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

  1. htmlSAXParseFile() 的工作做得很好,但它似乎自己创建了 DOM,在此过程中插入了bodyhtml元素。我想自己创建 DOM,因为我可能需要跳过一些元素并即时修改其他元素。是否有可能以某种方式告诉 libxml根本不要创建 DOM,而只是解析 HTML 并调用我的处理程序?
  2. 如果这对于 libxml HTML 解析器来说是不可能的,那么我不妨使用似乎不会创建 DOM 的 xmlSAXUserParseFile()。但是,由于文件具有类似 <p>...</p><p>...</p> 的结构,因此解析器会过早地吐出“文档末尾的额外内容”。有没有办法抑制一些解析错误,同时仍然收到有关它们的通知(只是因为没有人保证这些文件中永远不会有其他错误)?
  3. libxml 中有一大堆解析函数,其中一些接受 xmlParserOption 作为参数。唉,xmlSAXUserParseFile() 没有。而那些似乎都因为一些不相关的 API 设计原因而创建了 DOM。我错过了一个明显的候选人吗?

哦,我承认我不愿意使用 libxml 的 DOM 看起来像是一个怪癖。我受到 RAM 的极大限制,因此我迫切需要对 DOM 进行完全控制,以便能够在内存不足的情况下删除一些节点并在必要时重新读取它们。

提前致谢。

4

1 回答 1

6

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

我编写了所有的开始/结束元素处理程序,看起来 libxml 不再创建 DOM。至少,返回的文档指针是 NULL。它仍然坚持使用 html 和 body 元素,但我可以忍受。

一个主要问题是 libxml 无论如何都会保留所有空白节点。所以我必须解析文本内容以消除可忽略的空格。这很丑陋,但它有效。我应该提到解析 UTF-8 是您很少错过的那种乐趣吗?

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

感谢关注。

于 2010-06-08T20:33:12.917 回答