NSXMLParserを使用してリモートサーバーからXMLを解析する際に問題が発生しました。 XML-構造は次のようになります。NSXMLParser:iOSアプリケーションで2レベルの深さのXMLを解析します。
<data>
<sale id="example01">
<article>
<id>123</id>
<title>Some title</title>
<teaser>Some text</teaser>
</article>
<article>
<id>124</id>
<title>Some title</title>
<teaser>Some text</teaser>
</article>
</sale>
<sale id="example02">
<article>
<id>125</id>
<title>Some title</title>
<teaser>Some text</teaser>
</article>
<article>
<id>126</id>
<title>Some title</title>
<teaser>Some text</teaser>
</article>
</sale>
</data>
私は正常にXMLを解析され、私のCoreDataModelにそれを格納しますが、パーサは唯一の内の最初の「売却」の要素との記事をつかむように思えます。 次の「販売」要素になると、パーサーはエラーなく停止します。 XMLからのリモートデータの解析にNSXMLParserを使用することがよくありますが、この問題を解決する方法を見つけることはできません。 Salesから属性を取得することが重要です。なぜなら、 "sale"要素がセクションを表し、アーティクルがセルを定義するTableViewを作成する必要があるからです。
ドキュメントには、ルート要素は1つしか存在できませんが、ルート要素はありません。
EDIT#1: ここでは、私が使用するコードの一部です:
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
attributes:(NSDictionary *)attributeDict {
// If it's the start of the XML, remove everything we've stored so far
if([elementName isEqualToString:@"daten"])
{
[self emptyDataContext];
}
// Create a new Article
NSLog(@"Processing Element: %@", elementName);
if ([elementName isEqualToString:@"article"])
{
appDelegate.saleArticles = [[NSMutableArray alloc] init];
currentArticle = (Verkauf *)[NSEntityDescription insertNewObjectForEntityForName:@"Verkauf" inManagedObjectContext:managedObjectContext];
return;
}
}
設定要素値:
"Verkaufは、" 私のCoreDataModelでニュース-EntitiyにバインドされたDataObjectです
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if(!currentElementValue)
currentElementValue = [[NSMutableString alloc] initWithString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
else
[currentElementValue appendString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
NSLog(@"Processing Value: %@" ,currentElementValue);
}
は、要素の値を設定し、CoreDataモデルに追加します。
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
// !!! This is never called !!!
if([elementName isEqualToString:@"sale"]){
NSLog(@"!!!!!!!!!!!!!!Section End!!!!!!!!!!!!!!!!!!!!!!!");
return;
}
// If we're at the end of a county. Save changes to object model
if ([elementName isEqualToString:@"article"])
{
[appDelegate.saleArticles addObject:currentArticle];
// Sanity check
if(currentArticle != nil)
{
NSError *error;
// Store what we imported already
if (![managedObjectContext save:&error]) {
// Handle the error.
NSLog(@"%@", [error domain]);
}
}
return;
}
else if([elementName isEqualToString:@"teaser"]){
[currentArticle setTeaser:currentElementValue];
}
else if(..... };
EDIT#2: 私の初期化方法:
- (BOOL)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error
{
BOOL result = YES;
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];
// Set self as the delegate of the parser so that it will receive the parser delegate methods callbacks.
[parser setDelegate:self];
// Depending on the XML document you're parsing, you may want to enable these features of NSXMLParser.
[parser setShouldProcessNamespaces:NO];
[parser setShouldReportNamespacePrefixes:NO];
[parser setShouldResolveExternalEntities:NO];
[parser parse];
NSError *parseError = [parser parserError];
if (parseError && error) {
*error = parseError;
result = NO;
}
// deactivated because of ARC
// [parser release];
return result;
}
おそらくコードの一部を投稿する必要があります。私が見る限り、XMLについて何も奇妙なことはありません。 –