YIHtmlParser
基于 Hpple 开发,利用 libxml 进行 html 的增删查改。
背景
项目中的一个主要功能是展示 html 并进行屏幕适配。但由于 html 标签或样式中设置了宽高属性,可能导致展示不能适配屏幕,因此需要对 html 进行修改。
网上用于解析 html 的 Hpple 库只能进行解析,无法修改。但查看了一下代码,主要是使用 libxml,而 libxml 除了解析功能之外还有其他功能,因此有了这个库。
安装
pod 'YIHtmlParser'
使用示例
主要在 YIHtmlSimpleTests 和 YIHtmlParserTests 两个测试用例文件中展示,这里贴一下 YIHtmlSimpleTests。
- (void)testResultHtml {
NSString* html = @"\
<style type=\"text/css\">\
pre{\
max-width: 100%;\
}\
</style>\
<pre>haha</pre>";
NSData* data = [html dataUsingEncoding:NSUTF8StringEncoding];
YIHtmlParser* parser = [[YIHtmlParser alloc] initWithData:data encoding:nil];
[parser beginParser];
NSString* result = [parser resultHtml];
[parser endParser];
XCTAssertFalse([result containsString:@"<![CDATA["]);
}
- (void)testResult_SelfClosingTags {
NSString* html = @"<style type=\"text/css\"></style><img src=''/>";
NSData* data = [html dataUsingEncoding:NSUTF8StringEncoding];
YIHtmlParser* parser = [[YIHtmlParser alloc] initWithData:data encoding:nil];
[parser beginParser];
NSString* result = [parser resultHtml];
[parser endParser];
XCTAssertTrue([result isEqualToString:@"<html><head><style type=\"text/css\">\n</style></head><body><img src=\"\">\n</img></body></html>"]);
}
- (void)testNextSibling {
NSString* html = @"<div><table></table></div>";
NSData* data = [html dataUsingEncoding:NSUTF8StringEncoding];
YIHtmlParser* parser = [[YIHtmlParser alloc] initWithData:data encoding:nil];
[parser beginParser];
[parser handleWithXPathQuery:@"//table" action:^(NSArray * _Nonnull elements) {
YIHtmlElement* e = elements.firstObject;
[e addNextSibling:@"div" attribute:@{@"color":@"blue"}];
[e addPrevSibling:@"pre" attribute:nil];
}];
NSString* result = [parser resultHtml];
[parser endParser];
XCTAssertTrue([result isEqualToString:@"<html><body><div><pre>\n</pre><table>\n</table><div color=\"blue\">\n</div></div></body></html>"]);
}
- 先将 html 转换为 data,然后生成 YIHtmlParser 实例,必须配对使用 beginParser 和 endParser,在两者之间可以通过 handleWithXPathQuery 进行各种操作。