1

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

4 に答える 4

1

そのためには XML パーサーが必要です。

ここにチュートリアルがあります

于 2013-05-15T13:21:42.130 に答える
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

于 2013-05-15T13:33:54.863 に答える
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 と等しくないかどうかを確認する必要があります。

于 2013-05-15T13:23:05.427 に答える
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);
        }
    }

これがお役に立てば幸いですこのブログをもっと試してみてください.Git Project ResourceはあなたRAYWENDERLICHによる良いブログを助けます.

または、すべての HTML データがある場合は別のオプションで、この関数を使用してNSString特定の間のデータを取得できます。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;
}
于 2013-05-15T13:31:28.370 に答える