ios html有虚边,iOS HTML解析库Ono的一个缺陷

以前写的,不知道怎么就不见了,重发

Ono是iOS & OS X平台一个优秀的XML、HTML解析库,内部其实是对libxml2的封装。最近在使用的时候遇到了一个bug缺陷。

业务代码如下:

ONOXMLDocument *document = [ONOXMLDocument HTMLDocumentWithString:htmlString encoding:NSUTF8StringEncoding error:nil];

ONOXMLElement *element = [document firstChildWithXPath:@"/html/body/div"];

NSString *htmlContent = element.description;

这段代码的目的是提取html中的第一个div元素,通过XPath找到元素后调用description方法获得元素的html字符串。然而,解析之后发现这样的空内容标签变成了。这种变化对XML来说没什么影响,但是对HTML影响很大,举个例子:

hello world

代码效果差不多是这样的

bfa612d4af8c

调用description之后的html

hello world

效果差不多是这样的

bfa612d4af8c

后面的

标签被加上

的效果。

问题就出在description方法上,它的实现是这样的

- (NSString *)description {

xmlBufferPtr buffer = xmlBufferCreate();

xmlNodeDump(buffer, self.xmlNode->doc, self.xmlNode, 0, false);

NSString *rawXMLString = @((const char *)xmlBufferContent(buffer));

xmlBufferFree(buffer);

return rawXMLString;

}

xmlNodeDump得到的是去除空标签的buff。经过一番搜索,网上提到要使用xmlsave模块,保存的时候options加上XML_SAVE_NO_EMPTY。修改之后的代码;

- (NSString *)description {

xmlBufferPtr buffer = xmlBufferCreate();

xmlSaveCtxtPtr saveCtxtPtr = xmlSaveToBuffer(buffer,NULL, XML_SAVE_NO_EMPTY);

long result = xmlSaveTree(saveCtxtPtr, self.xmlNode);

xmlSaveClose(saveCtxtPtr);

NSString *rawXMLString = result < 0 ? nil : @((const char *)xmlBufferContent(buffer));

xmlBufferFree(buffer);

return rawXMLString;

}

一个挺简单的问题解决,希望能帮到遇到同样问题的人。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值