2

我一直在研究一个使用 libxml2 HTMLParser 模块在 iOS 上解析网页 HTML 的项目。每当我尝试解析包含以下行的网页时,我都会从 libxml2 的 htmlParseDocument 中收到 EXC_BAD_ACCESS 错误:

<?xml version="1.0" encoding="UTF-8"?>

如果我从 HTML 中去掉这一行,解析就完美了。

另请注意,我使用 DTHTMLParser 类将 libxml2 SAX 回调绑定到 Objective-C 代码。

由于 htmlParseDocument 中的 EXC_BAD_ACCESS 并没有太多的工作要做,因此我构建了一个示例 Xcode 项目来重现该错误。我在针对 iOS 5.1 的 Mountain Lion 上的 Xcode 4.4 中制作了它。首先,它解析一个不包含违规行的 HTML 文件,然后它尝试解析包含违规行的文档并崩溃。你可以在这里下载:http: //michaelmanesh.com/code/libxml2-crash.zip

4

2 回答 2

1

DTHTMLParser 中的问题显然是在 libxml 中准备 c 回调的方法没有将遇到处理指令时要调用的函数的函数指针设置为 NULL。因此,处理指令导致 libxml2 尝试在某个随机地址调用函数,从而导致 EXC_BAD_ACCESS。

我解决了 DTHTMLParser 中的问题,方法是实现对在遇到处理指令时调用的可选委托方法的支持,或者如果在委托中未实现,则在处理程序结构中为 NULL。

于 2012-08-09T17:03:12.947 回答
0

我认为 LibXML 错误地将其视为具有几乎相同语法的处理指令。Libxml 将其中包含的每一行<?视为处理指令。虽然我不能确切地指出出了什么问题。如果您删除问号,它将作为常规元素解析,您将在parser:didStartElement:attributes:回调方法中获取属性。如果您在问号和 xml ( <? xml) 之间放置一个空格,它将在parser:foundCharacters方法中返回。我不知道您的要求是什么,但这是使其不会崩溃的两种方法。

于 2012-08-09T03:53:53.690 回答