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 つの質問 (長々とすみません) 要素名で大文字と小文字が区別されないのはなぜですか? 両方の言語で大文字と小文字が区別されます。