0

NSXMLParser のチュートリアルを行いました。私が完全に途方に暮れているのは、NSXMLParser が異なる要素をどのように区別するかということです。私には未定義のようです。

これは私のXMLです

<?xml version="1.0" encoding="UTF-8"?>
<Prices>
<Price id="1">
<name>Rosie O'Gradas</name>
<Beer>4.50</Beer>
<Cider>4.50</Cider>
<Guinness>4</Guinness>
</Price>
</Prices>

そして、これは私のパーサーです

-(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
if ([elementName isEqualToString:@"Prices"]) {
    app.listArray = [[NSMutableArray alloc] init];
    NSLog(@"The Prices Count");
}
else if ([elementName isEqualToString:@"Price"]) {
    thelist = [[List alloc] init];
    thelist.drinkID = [[attributeDict objectForKey:@"id"]integerValue];
}
}

-(void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if (!currentElementValue) {
    currentElementValue = [[NSMutableString alloc]initWithString:string];

} else {
    [currentElementValue appendString:string];
}

 }

-(void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"Prices"]) {
    return;
}
if ([elementName isEqualToString:@"Price"]) {
    [app.listArray addObject:thelist];
    thelist = nil;

} else {
    [thelist setValue:currentElementValue forKey:elementName];
    currentElementValue = nil;
}
 }

データ オブジェクトのプロパティの名前がパーサーと同じであることに気付きました。だから私は少なくともそれを理解しました。

私が途方に暮れているのは、これらのプロパティに値を割り当てる場所です。

したがって、最初にデータオブジェクトを初期化します

      thelist = [[List alloc] init];

(リストはデータオブジェクトです)しかし、それは私が理解できない最初のことをします

     thelist.drinkID = [[attributeDict objectForKey:@"id"]integerValue];

if ステートメントにあるため、id 属性が見つかるたびに上書きされません。それとも、'theList' 宣言が複数のオブジェクトを作成していますか?

見つかった文字では、何が起こっているのか本当にわかりません。私が言えることは、foundCharaters 文字列は要素内のすべてのテキストです。したがって、現在の要素の値は、実際には、一緒に追加された文字列のバンドルにすぎません (ただし、何らかの理由で NSLOG できないため、わかりません)。

そこから didEndElement セクションで、これがコードの正しい解釈であるかどうか疑問に思います。

    if ([elementName isEqualToString:@"Price"]) {
    [app.listArray addObject:thelist];
    thelist = nil;
    }

パーサーが要素 Price にヒットするたびに、app.list 配列オブジェクト (別のクラスで宣言されている) に「thelist」オブジェクトが追加されていることを理解しています。

しかし、ここで、以前の方法での私の理解不足が有効になります

else {
    [thelist setValue:currentElementValue forKey:elementName];
    currentElementValue = nil;
}

彼らはここで何をしているのですか?私が見たところ、現在の要素の値は、XML ファイルからの文字の寄せ集めにすぎません。それはどのように組織されていますか?要素名で?

もう 1 つの質問 (長々とすみません) 要素名で大文字と小文字が区別されないのはなぜですか? 両方の言語で大文字と小文字が区別されます。

4

1 に答える 1

0

私があなたの質問を正しく解釈するならば、それはうまく機能しているコードを理解することだけです。

XMLにはPriceid=1name、、、およびの4つの子要素Beerがあります。CiderGuinness

このfoundCharactersメソッドは、これらの4つのxmlタグの文字、つまり、と、、などの間に記述された文字を検索 します。この場合、これはの文字列であり、次になどの文字列です。<name></name><Beer></Beer>Rosie O'Gradasname4.50Beer

文字が見つかると、メソッドは最初にコンテナ文字列が存在するかどうかをチェックし、存在しない場合は、として作成しcurrentElementValueます。存在する場合は、見つかった文字を追加します。

次に、論理的に何が起こりますか?メソッドにヒットします。didEndElement最初のケースではタグ</name>です。この場合、収集されたテキストがcurrentElementValueキーに割り当て@"name"られ、このキーと値のペアがリストに追加されます。リストは、List別の場所で定義されているタイプですが、本質的にはのようNSDictionaryです。

正常に保存されているためcurrentElementValue、破棄する必要があります。次にヒットしたときに存在するかどうかのチェックfoundCharactersが機能します。

クリア?

于 2012-06-10T13:43:34.660 に答える