2009-08-25 8 views
0

私は戻って、このこの応答を取得する場所私はAPIで働いている、と私はそれのうち整数IDを解析したい:Obj CでこのXMLレスポンスからどのように整数を解析しますか?

<?xml version="1.0"?> 
<trip>328925</trip> 

はどのようにあなたはこれを解析するのでしょうか?私は取り除くしたいいくつかの本当に脆弱なコードを持っている、と私はいくつかのアドバイスをいただければと思います:

if ([[response substringWithRange:NSMakeRange(0, 21)] 
    isEqualToString: @"<?xml version=\"1.0\"?>"]) { 

    self.tripId = [response substringWithRange:NSMakeRange(28, response.length-35)]; 
} 

私は、このタスクのためのライブラリーを解析するXMLを必要としないと思います!

+2

はい、あなたが実行します。

それはハードのいずれかを実行することはありません。 XMLでは、意味的に同等の文書を直列化する多くの方法があるため、XMLを「単なる文字列」として扱うことは、バグを導入する確実な方法です。ドキュメントのプロデューサがスキーマ参照またはコンテンツエンコーディングとして名前空間参照を追加する場合、上記のメソッドは中断します。私は良いXMLライブラリを見つけるだろう、XPath/XQueryでノードを選択し、テキストの内容を解析します。 –

答えて

4

私はXMLパーサを使用します。 XMLパーサーを使用することは、実際にXMLを解析する最良の方法です。

// Parser Delegate 
@interface ParserDelegate : NSObject { 
    int inTripElements; 
    NSMutableString* trip; 
} 
@property (readonly) NSMutableString* trip; 
@end 

@implementation ParserDelegate 

@synthesize trip; 

- (id) init { 
    if (![super init]) { 
     [self release]; 
     return nil; 
    } 
    trip = [@"" mutableCopy]; 
    return self; 
} 

- (void) parser:(NSXMLParser *)parser 
didStartElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
    qualifiedName:(NSString *)qualifiedName 
    attributes:(NSDictionary *)attributeDict { 
    if ([elementName isEqualToString:@"trip"]) { 
     ++inTripElements; 
    } 
} 

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    if (inTripElements > 0) { 
     [trip appendString:string];   
    } 
} 

- (void) parser:(NSXMLParser *)parser 
    didEndElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
    qualifiedName:(NSString *)qName { 
    if ([elementName isEqualToString:@"trip"]) { 
     --inTripElements; 
    } 
} 

@end 


// Parsing 
NSString* toParse = @"<?xml version=\"1.0\"?>" 
          "<trip>328925</trip>"; 

NSData* data = [NSData dataWithBytes:[toParse UTF8String] 
           length:strlen([toParse UTF8String])]; 

ParserDelegate* parserDelegate = [[ParserDelegate alloc] init]; 
NSXMLParser* parser = [[NSXMLParser alloc] initWithData:data]; 

[parser setDelegate:parserDelegate]; 
[parser parse]; 
[parser release]; 

NSLog(@"trip=%@", parserDelegate.trip); 
[parserDelegate release]; 
+0

ありがとうございます、あなたの答えは完璧です。私は実際にチュートリアルを見つけたので、同じコードを書くようになった:http://weblog.bignerdranch.com/?p=48 –

-1

「NSScanner」をチェックしてください。これは完璧です。

コードが <?xml宣言が送信またはUTF-8 またはSomoneのからエンコードの変更が追加されていない場合、何が起こるか、この場合、例えば を変更します多くの例があるとしてあなたは、このためにXMLライブラリを使用する必要があります
-2

XMLは、このすべてを解析すると、すべてのこれらのケースでは、ファイルの提供者がファイルを言うことができトリップ要素

の前にスペース正しい

など

が行われていると、あなたのコードはより堅牢です

この場合も、解析して見つけるコードは非常に簡単です。

0

実際にXMLパーサーを使用して適切なオブジェクトを作成したくない場合は、正規表現<trip>\d*</trip>を使用して要素に一致させるのはなぜですか?その後、開始タグと終了タグを削除して整数部分を取得し、任意の文字列の場合と同様に解析することができます。

正規表現をテストするのに便利な場所です。 http://regexlib.com/RETester.aspx

関連する問題