YIHtmlParser 1.0.4

YIHtmlParser 1.0.4

zhenghongyi 维护。



  • 作者:
  • 郑洪益

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 进行各种操作。