0

私はこのようなXMLファイルを持っています。私はNSXMLParserそれを解析するために使用しています:

<? xml version ='1.0' encoding="UFT-8"?>
<!DOCTYPE plist PUBLIC "-//apple//DTD PLIST 1.0//EN" "http://www.apple/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<Data>
   <item>
     <date>2012-07-24</date>
     <name>A</name>
     <count>100</count>
     <startDate>2012-07-24</startDate>
     <stopDate>2012-07-24</stopDate>    
   </item>
   <item>
     <date>2012-07-24</date>
     <name>A</name>
     <count>100</count>
     <startDate>2012-07-24</startDate>
     <stopDate>2012-07-24</stopDate>
   </item>

</Data>
</plist>

IBAtion を使用して、xml ファイルを次のように解析します。

    - (IBAction)Parser:(id)sender {
    NSXMLParser *xmlParser = [[NSXMLParser alloc]initWithContentsOfURL:[[NSBundle mainBundle]      URLForResource:@"file2" withExtension:@"xml"]];
    [xmlParser setDelegate:self];
    BOOL flag =[xmlParser parse];
    if (flag) {
        NSLog(@"OK");
    } else {
        NSLog(@"false");
    }
    [xmlParser release];
}


-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:    (NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict

{
     NSLog(@"%@found a %@ element",self,elementName);
     if ([elementName isEqual:@"Data"]) {
        [data release];
        data = [[Data alloc]init];

    [data setParentParserDelegate:self];
    [parser setDelegate:data];
}

}

ありprintf "OK"となしprintf "NSLog(@"%@found a %@ element",self,elementName)"

4

2 に答える 2

0

NSXMLParser はストリームベースであり、XML ストリーム内の特定のコンポーネント (開始タグ、テキスト、終了タグなど) に遭遇すると、デリゲートにさまざまなメッセージを送信します。したがって、NSXMLParser のインスタンスを作成し、それに、NSXMLParserDelegateプロトコルに準拠する作成したデリゲートを割り当てます。(編集:質問に追加したコードから、この部分をすでに行っているか、少なくとも良いスタートを切っているようです。

デリゲート クラスの-parser:didStartElement:...メソッドで、要素名を確認します。「メッセージ」の場合は、新しい NSMutableDictionary を作成して、その子要素に情報を保持し、それをプロパティに保存します: (編集: コードでは、インスタンス変数を宣言したように見えますが、ドットを使用する必要があります。プロパティとしてアクセスするための構文を使用して、正しいメモリ管理が確実に行われるようにします。 )

self.listOfFriends = [NSMutableDictionary dictionary];

他の要素名については、テキストを保持するために使用される空の NSMutableString を作成し、それをプロパティに保存します。

self.thisString = [NSMutableString string];

-parser:foundCharacters:メソッドで、前に作成した変更可能な文字列プロパティに文字列を追加します。

[self.thisString appendString:string];

最後に、-parser:didEndElement:...メソッドで要素名を確認します。「メッセージ」の場合、このメッセージ要素はこれで完了です。XML ストリームに Message 要素が 1 つしかない場合 (例のように)、作成したディクショナリを印刷したり、それを使ってやりたいことを何でも印刷したりできます。複数の Message 要素が存在する可能性がある場合は、完成したばかりの要素を配列に追加できます。

直前の要素がMessage でない場合は、要素名をキーとして渡し、以前のメッセージ-setValue:forKey:を受信したときに作成した構築文字列を値として辞書に追加します。-parser:foundCharacters:

[self.listOfFriends setValue:self.thisString forKey:elementName];
于 2012-07-26T05:22:52.587 に答える
0

コードに 2 つの問題が見つかりました。

まず、xml が間違っています。最初の行は次のようになります。

<?xml version="1.0" encoding="UTF-8"?> 

第二に、パーサーの構造が間違っています。基本的に、URL を間違った方法で初期化しています。そのはず:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"file2" ofType:@"xml"];
NSXMLParser *xmlParser = [[NSXMLParser alloc]initWithContentsOfURL:[NSURL fileURLWithPath:filePath]];

コードにこれら 2 つの変更を加えると、完全に動作します。

お役に立てれば。

于 2012-07-26T05:32:18.043 に答える