我坚持使用NSXMLParser解析来自远程服务器的XML的问题。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中,但是解析器似乎只获取了第一个“销售”元素和其中的文章。当进入下一个"sale“元素时,解析器停止,不会出现错误。我经常使用NSXMLParser来解析远程数据,但是我不知道如何解决这个问题。从sales获取属性对我来说很重要,因为我必须创建一个TableView,其中的“sales”元素表示节,而文章定义其中的单元格。
文档上说只能有一个根元素,但我的根元素不是吗?
EDIT#1:下面是我使用的一些代码:
"Verkauf“是绑定到我的CoreDataModel中的新闻实体的DataObject:
- (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;
}
}设置元素值:
- (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;
}发布于 2012-03-13 20:07:37
我在您的代码或XML中都看不到任何东西(尽管我注意到您可能对XML进行了英语化),所以要么是我漏掉了(很可能),要么就是它有些奇怪。
NSXMLParser将为您提供比您提供的更多的信息。parse方法返回一个BOOL。它返回的是什么?如果它是一个NO,您可以使用parserError方法来获取一个NSError对象,该对象将为您提供更多信息。
https://stackoverflow.com/questions/9683047
复制相似问题