0

我是 iPhone 应用程序编程的新手。我无法从 XML 文件中获取价值并将其显示在 UITableView 中。我需要获取动物的名称值。解析没有属性的 XML 的简单方法是什么?我已阅读 NSXMLParser 文档,但数据未显示在我的 UITableView 中。这是我的 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>
<animals>
  <animal>
    <id>1</id>
    <name>Elephant</name>
  </animal>
  <animal>
    <id>2</id>
    <name>Tiger</name>
  </animal>
  <animal>
    <id>3</id>
    <name>Bird</name>
  </animal>
</animals>

我遵循一些关于使用属性解析 XML 的教程,但是在我的 XML 文件中,我没有属性。这是我解析 XML 的代码:

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

     if([elementName isEqualToString:@"animals"]) {
      appDelegate.animals = [[NSMutableArray alloc] init];
     }

     else if([elementName isEqualToString:@"animal"]) {  
     }

        else if([elementName isEqualToString:@"id"]){
      aAnimal = [[Animal alloc] init];
      aAnimal.animalID = elementName;
     } 
    }

    - (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:@"animals"])
      return;
     else if([elementName isEqualToString:@"animal"]) {
     }
        else if([elementName isEqualToString:@"id"]) {
      [appDelegate.animals addObject:aAnimal];      
      [aAnimal release];
      aAnimal = nil;
     }
     else 
      [aAnimal setValue:currentElementValue forKey:elementName];

     [currentElementValue release];
     currentElementValue = nil;
    }
4

2 回答 2

0

就像 ReaddyEddy 提到的,您需要通过设置解析器 foundCharacters 委托来保存当前字符串。所以它应该看起来像这样:

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if (!currentStringValue) {
    // currentStringValue is an NSMutableString instance variable
    currentStringValue = [[NSMutableString alloc] initWithCapacity:50] ; // +1
}

NSString *tempString = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
if ([tempString length] > 0) {
    [currentStringValue appendString:tempString] ;
}

}

然后在您的解析器 didEndElement 中,您需要检查元素名称以匹配您想要的标签。然后保存 currentStringValue:

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

if ( [elementName isEqualToString:@"id"]) {
    self.id = currentStringValue ;
}

if ( [elementName isEqualToString:@"name"]) {
    self.name = currentStringValue ;
}

}

我通常所做的是将foundCharacters 放在一个名为baseModel.m 的类中。然后我的所有其他模型都继承自它。并且每个继承都简单地实现自己的解析器 didEndElement 方法。在您使用 Animals 和 Animal 的情况下,我还将有两个模型,一个带有 Animals,一个带有 Animal,在 Animals.m 中,我会查找标签 Animal,然后创建一个 Animal 对象(就像您在那里所做的那样),但是然后我会简单地将委托设置为新创建的 Animal 对象,并让 Animal 模型处理它自己的解析。但是,如果您这样做,您需要检查每个的结束标记并将委托设置回父级。

于 2010-03-02T23:19:46.950 回答
0

相当普遍的问题;一个示例解决方案是回答问题的 Apple 示例 XMLPerformance 中的 CocoaXMLParser。本质上定义一个布尔值来控制字符数据收集和一个字符串来保存它,确保你在某处初始化字符串。

在以下位置打开字符集合: - (void)parser:(NSXMLParser *)parser didStartElement 在以下位置实例化您的变量:

  • (void)parser:(NSXMLParser *)parser didEndElement

收集人物:

  • (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { if (storingCharacters) [currentString appendString:string]; }
于 2010-02-06T19:47:09.167 回答