在 iOS 中使用 libxml2 解析 (X)Html 的示例
最近,我开始在 iOS iPhone 项目中使用 libxml2 库。我读了一些有用的链接,例如:
http:// laurentparenteau.com/blog/2009/12/parsing-xhtml-in-ca-libxml2-tutorial/
以及一些非常好的帖子:
http://bill.dudney.net/roller/objc/entry/libxml2_push_parsing
我管理检索远程 html(使用 ASIHTTPRequest)并成功获取推送到包含创建的解析器的包装类的“didReceiveData”事件上的数据(NSData)与 htmlCreatePushParserCtxt (SAX 样式)。我很好地得到了 startDocument 和 endDocument 回调。在“startElement”和“characters”回调中,我打印“localname”参数(const xmlChar)。在控制台中,我看到它找到“html”,然后是“body”,然后是一些“p”标签,但随后我得到了很多无法识别的字符(有时它看起来甚至像中文......)......
无论如何,在进入之前对于很多代码细节,我想问是否有人有一个在基于 Objective-C 的项目中使用 libxml2 解析 (x)html 的工作示例?我尝试在谷歌上搜索更多比提到的两个链接,但直到现在还没有运气。
Recently I started to play around with the libxml2 lib within an iOS iPhone project. I read some useful links, like:
http://laurentparenteau.com/blog/2009/12/parsing-xhtml-in-c-a-libxml2-tutorial/
and some very nice post here:
http://bill.dudney.net/roller/objc/entry/libxml2_push_parsing
I managed to retrieve remote html (with ASIHTTPRequest) and successfully get the data (NSData) on the 'didReceiveData' event pushed to a wrapper class containing a parser created with htmlCreatePushParserCtxt (SAX style). I get nicely the startDocument
and endDocument callbacks. In the 'startElement' and 'characters' callbacks, I print the ' localname' paramater (const xmlChar). In the console I see that it finds 'html', then 'body', then some 'p' tag, but then I get lots of unrecognizable characters (sometimese it looks even like Chinese..)...
Anyway, before getting into to much code details, I want to ask if anyone has a working example of parsing (x)html with libxml2 in an objective-c based projet? I tried googling for more then the 2 mentioned links, but until now no luck.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我建议 alan quartemain 的
AQXMLParser
: http://blog.alanquatermain.me/2013/01/09/using-aqxmlparser-and-friends/这是一个围绕 libxml2 的薄包装器,并且比 NSXMLParser 性能更高。
将
HTMLMode
属性设置为 yes,以便它在 html 模式下使用 libxml..(我使用了很多次,即使使用无效的 html,它也表现得很好)I'd propose
AQXMLParser
by alan quartemain : http://blog.alanquatermain.me/2013/01/09/using-aqxmlparser-and-friends/it is a thin wrapper aroung libxml2 and a lot more performat than NSXMLParser.
set
HTMLMode
property to yes so it uses libxml in html mode.. (I used it many times and it does quite well even with non-valid html)为什么要使用
libxml2
而不是 Apple 的内置NSXMLParser
类?如果您正在为 iOS 开发应用程序,那么使用 Foundation 类比 C 库更有意义。您可以访问 NSXMLParser 的文档 在苹果网站上。如果您不想直接使用 NSXMLParser,您可以尝试使用 NSXMLDocument,它有一个易于使用的
- (id)initWithData:(NSData *)data options:(NSUInteger)mask error:(NSError **)error
用于解析 XML 数据的方法。您甚至可以使用 init 方法的 NSXMLDocumentTidyHTML 选项将 HTML 数据读取为 XHTML。Why would you want to use
libxml2
over Apple's built-inNSXMLParser
class? If you are making an application for iOS, it makes more sense to use a Foundation class for this than a C library. You can access the documentation for NSXMLParser on Apple's website.If you don't want to use NSXMLParser directly, you could try parsing XML with NSXMLDocument, which has an easy-to-use
- (id)initWithData:(NSData *)data options:(NSUInteger)mask error:(NSError **)error
method for parsing XML data. You can even use theNSXMLDocumentTidyHTML
option for the init method to read HTML data as XHTML.