ios - 如何在ios中解析HTML内容?

时间:2013-05-15 13:19:06

标签: iphone ios objective-c xml-parsing html-parsing

如何解析HTML文件?

我在下面的代码中得到一个HTML文件,我只想在BinarySecurityToken XML节点之间获取数据。

 - (void)connectionDidFinishLoading:(NSURLConnection *)connection
 {
   if(_data)
  {
    //Here am getting the below HTML content
    NSString* content = [[NSString alloc] initWithData:_data
                                              encoding:NSUTF8StringEncoding];
  }
 }


<input type="hidden" name="wa" value="wsignin1.0" />
<input type="hidden" name="wresult"
    value="<t:RequestSecurityTokenResponse xmlns:t="http://schemas.xmlsoap.org/ws/2005/02/trust">
<t:Lifetime>
   <wsu:Created >2013-04-29T11:50:29.895Z</wsu:Created>
   <wsu:Expires>2013-04-29T12:00:29.895Z</wsu:Expires>
</t:Lifetime>
<wsp:AppliesTo>     
<EndpointReference>
<Address>urn:orin.converse</Address>
</EndpointReference></wsp:AppliesTo>
<t:RequestedSecurityToken>    
   <wsse:BinarySecurityToken>
         aHR0cCUzYSUyZiUyZnNjaGVtYWd0Sjk0JTNk
   </wsse:BinarySecurityToken>

有什么想法吗?提前谢谢。

4 个答案:

答案 0 :(得分:1)

你需要和XML解析器。

有一个教程here

答案 1 :(得分:1)

您可以使用此代码

NSRange divRange = [content rangeOfString:@"<wsse:BinarySecurityToken>" options:NSCaseInsensitiveSearch];
    if (divRange.location != NSNotFound)
    {
        NSRange endDivRange;

        endDivRange.location = divRange.length + divRange.location;
        endDivRange.length   = [content length] - endDivRange.location;
        endDivRange = [content rangeOfString:@"</wsse:BinarySecurityToken>" options:NSCaseInsensitiveSearch range:endDivRange];

        if (endDivRange.location != NSNotFound)
        {
            divRange.location += divRange.length;
            divRange.length  = endDivRange.location - divRange.location;


            NSLog(@"BinarySecurityToken : %@",[content substringWithRange:divRange]);
        }
    }

输出: aHR0cCUzYSUyZiUyZnNjaGVtYWd0Sjk0JTNk

答案 2 :(得分:0)

对于这种特殊情况,您可以获得<wsse:BinarySecurityToken></wsse:BinarySecurityToken>的范围,构建将为您提供令牌位置的新范围,并获取该范围内的子字符串。

示例代码:

NSRange openingTagRange = [htmlString rangeOfString:@"<wsse:BinarySecurityToken>"];
NSRange closingTagRange = [htmlString rangeOfString:@"</wsse:BinarySecurityToken>"];
NSRange tokenRange = NSMakeRange(openingTagRange.location + openingTagRange.length, closingTagRange.location - (openingTagRange.location + openingTagRange.length));
NSString *token = [htmlString substringWithRange:tokenRange];

由于您的输入来自外部,您应该检查范围的位置是否不等于NSNotFound。

答案 3 :(得分:0)

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];
    NSData  * data      = [NSData dataWithContentsOfFile:filePath];
    TFHpple * tutorialsParser       = [[TFHpple alloc] initWithHTMLData:data];

    NSString *query = @"//div[@id='BinarySecurityToken']";
    NSArray *nodes = [tutorialsParser searchWithXPathQuery:query];

    for (TFHppleElement * element in nodes) {
        NSLog(@"%@", element);
        NSLog(@"%@", [element tagName]);
        NSLog(@"%@", [element attributes]);
        NSLog(@"%@", [element children]);
        for (TFHppleElement *childElement in [element children]) {
                NSLog(@"%@", childElement);
        }
    }

希望这可以帮助您For more try this blogGit Project Resource may help you Good blog by RAYWENDERLICH

或其他选项如果您拥有NSString中的所有HTML数据,则可以使用此功能在特定NSString之间获取数据。

-(NSString*)stringBetweenString:(NSString*)start andString:(NSString)end {
    NSRange startRange = [self rangeOfString:start];
    if (startRange.location != NSNotFound) {
        NSRange targetRange;
        targetRange.location = startRange.location + startRange.length;
        targetRange.length = [self length] - targetRange.location;   
        NSRange endRange = [self rangeOfString:end options:0 range:targetRange];
        if (endRange.location != NSNotFound) {
           targetRange.length = endRange.location - targetRange.location;
           return [self substringWithRange:targetRange];
        }
    }
    return nil;
}