0

私は現在、iPhone を介してサーバーの aMule ステータスを制御するソフトウェアに取り組んでいます。解析する必要がある xml を吐き出すソケットを作成しましたが、NSXMLParser はイベント駆動であるため、これがどのように行われるかを理解するのに問題があります。仕事...私はこのタイプのXML構造を考えました。それを構造化するためのより良い方法のアイデアがあれば教えてください!! :D

<root type="donwloads">   <-- specifies downloads or search results
<file name="Ubuntu_9_10.iso" status="[11,6%]" />
<file name="Fedora 12.iso" status="[56,2%]" />
</root>

私が考えていたのは、これをテーブルビューに入れたいので、おそらく結果に基づいて多くのNSDictionariesを持つNSMutableArrayが必要になるということです.すべての辞書はファイルでなければなりません..あなたは何を提案しますか?? この状況をどのように処理すればよいですか?

ありがとう

4

3 に答える 3

1

NSMutableArrayは、NSDictionaryメモリ内のデータ構造にとって合理的なアプローチのようです。

NSXMLParser基本的に、XMLファイルを実行するときにその配列を構築する一連のコールバックがあります。

- (void) parseXML:(NSString *) filename {
    NSURL *xmlURL = [NSURL fileURLWithPath:filename];

    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];

    [xmlParser setDelegate:self];

    [xmlParser parse];

    // Check for errors.
    NSError *errorCode = [xmlParser parserError];
    if (errorCode) {
        // handle error here
        NSLog(@"%@", [errorCode localizedDescription]);
    }

    [xmlParser release];
}

そしてあなたの主な代表者:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
{
    // If certain elements are found initialize the object
    if ([elementName isEqualToString:"@file"]) {
       NSMutableDictionary *currentFile = [[NSMutableDictionary alloc] init];
       // Look through the attributes add stuff to your dictionary
       // Add it to your array.
    }
}

すべてのデータが属性で返されるため、この方法で行うことができます。それ以外の場合は、ファイルを保存してビルドし(foundCharactersデリゲート)、ファイルのタグがデリゲートで発生したときに最終的に配列に追加する必要がありますdidEndElement

于 2010-01-05T22:30:11.260 に答える
1

あなたの答えに感謝します:D 幸いなことに、私は10分後に問題を解決しました:D ill私がしたことを投稿します:

XML:

<root>
  <downloads>
<file type="text" name="fdsdf" />
<file type="text" name="sdfsdfssds" />
  </downloads>
</root>

NSXMLParser デリゲート:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName       namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict{
if([elementName isEqualToString:@"downloads"] || [elementName isEqualToString:@"results"]){
    NSLog(@"starting or downloads or results");
    if(xmlArray){
        xmlArray= nil;
    }
    self.xmlArray= [[NSMutableArray alloc] init];
}
else if([elementName isEqualToString:@"file"]){
    NSLog(@"found file...");
    [self.xmlArray addObject:attributeDict];
   }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
if([elementName isEqualToString:@"downloads"] || [elementName isEqualToString:@"results"]){
    if([elementName isEqualToString:@"downloads"]){
        NSLog(@"downloads found: %@...  reloading table", xmlArray);
    }
  }
}

これが私と同じ問題を抱えている人を助けることができることを願っています:D

于 2010-01-06T03:07:35.540 に答える
1

パーサー コールバック イベントが発生したときに、ノードを Core Data 管理対象オブジェクトに変換し、管理対象オブジェクト コンテキストに保存するパーサー クラスを記述します。

を使用しNSFetchedResultsControllerてコア データ ストアにアクセスします。管理対象オブジェクトが入って保存されると、結果コントローラーはフェッチした結果でテーブル ビューを更新します。

于 2010-01-05T22:28:05.610 に答える