我正在尝试使用NSXMLParser解析此XML。我有多个"咖啡"在XML文件中,如下所示:
… More XML
<Coffee>
<Type Name="Type">Minimum Drinking Amount</Type>
</Coffee>
<Coffee>
<Type Name="Type">Maximum Drinking Amount</Type>
</Coffee>
… More XML
现在,一旦NSXMLParser找到&#34; Coffee&#34;的第一个实例,就完成并转移到XML的其余部分。哪个......好不好,我不喜欢它。我需要它来阅读&#34; Coffee&#34;的所有实例。这就是我在Objective-C中处理它的方式。
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
NSLog(@"Fired Stick1");
_xmlString = elementName;
if ([_xmlString isEqualToString:@"Coffee"]) {
NSLog(@"Stick1 Coffee:");
}
if ([_xmlString isEqualToString:@"Tea"]) {
NSLog(@"Stick1 Tea:");
}
然后是foundCharacters委托:
-(void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if ([_xmlString isEqualToString:@"Coffee"] || [_xmlString isEqualToString:@"Tea"]) {
NSLog@"%@ Called", _xmlString);
}
if (!_coffeeString) {
_coffeeString = [[NSMutableString alloc] initWithString:string];
}
else {
_coffeeString = string;
}
if (coffeeArray == NULL) {
NSLog(@"Stick1 the coffeeArray was null");
coffeeArray = [[NSMutableArray alloc] init];
}
//add the returned string into an array
[coffeeArray addObject:_coffeeString];
NSLog(@"Stick1 array %@", coffeeArray);
// parse the returned data in array
NSString *seperate = [coffeeArray componentsJoinedByString:@"\n"];
NSLog(@"Stick1 seperate is %@", seperate);
// another parsing
NSArray* words = [seperate componentsSeparatedByCharactersInSet :[NSCharacterSet whitespaceAndNewlineCharacterSet]];
//or use newLineCharecterSet
// Take out all of the whitespace like tabs and spaces and new lines
_singleName = [words componentsJoinedByString:@""];
NSLog(@"Stick1 final result %@", _singleName);
}
基本上,它会被调用两次,但不会显示两组数据。一旦找到咖啡,它会显示咖啡的第一部分(最小值),但无法显示第二个咖啡实例(最多)。
答案 0 :(得分:1)
我认为你有几个问题正在发生。一个是(至少使用提供的XML),<Coffee>...</Coffee>
定义了一个完整的XML文档,因此您可能会收到一个未处理的解析错误。您应该在NSXMLParserDelegate
中实现以下代码,并查看报告的问题:
- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
NSLog(@"error: %@", parseError);
}
- (void)parser:(NSXMLParser *)parser validationErrorOccurred:(NSError *)validationError {
NSLog(@"error: %@", validationError);
}
您还有一些问题,即您尝试根据节点的标记名称(elementName
)在代码中设置触发器/标记,但实际上您关心的是子网中包含的数据节点
此外,parser:foundCharacters:
NOT 保证在一个字符串中返回标记的全部内容,因此您处理两者 {{ 1}} 和 parser:didStartElement:...
。然后,在parser:didEndElement:...
中,您可以确保自己位于适当的节点中,并追加找到已找到的字符。
以下是一些示例代码,可根据您提供的数据开始使用
注意:我只是在拍摄你真正想要的东西,因为你的数据有点模糊。此外,我在一个全新的单一视图应用程序的App Delegate中做到了这一点。这是 NOT 实现真正实现的方式!
parser:foundCharacters: