我正在向服务器发送查询并使用此代码获取响应
NSString *urlString = @"myPHPQuery";
NSURL *parserUrl = [[[NSURL alloc] initWithString:urlString] autorelease];
NSXMLParser *parser = [[[NSXMLParser alloc] initWithContentsOfURL:parserUrl] autorelease];
[parser setDelegate:self];
[parser parse];
我可以得到这种类型的回复
<users>
<username>nothan</username>
<score>1000</score>
</users>
<users>
<username>nothan</username>
<score>1000</score>
</users>
我正在使用此代码来解析Mutable Array
中的数据int arrayCount = 0;
NSString *elementname;
NSInteger * count;
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
elementname = elementName;
}
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
if([elementname isEqualToString:@"username"])
{
if ( count == 0 )
{
NSLog(@"%@" , string);
[self.playerNames replaceObjectAtIndex:arrayCount withObject:string];
arrayCount = arrayCount + 1;
count = count + 1 ;
}
else
count = 0;
}
else if([elementname isEqualToString:@"score"])
{
if ( count == 0 )
{
NSLog(@"%@" , string);
[self.scores replaceObjectAtIndex:arrayCount withObject:string];
count = count + 1 ;
}
else
count = 0;
}
}
- (void)parserDidEndDocument:(NSXMLParser *)parser
{
for (int i = 0 ; i <10 ; i++)
{
NSLog(@"%d - %@" , i,[playerNames objectAtIndex:i]);
}
}
此代码的问题是,它只检索一个
<users> .... </users>
如何更改此代码以使其检索更多用户。
最好的问候
答案 0 :(得分:1)
对于您在上面发布的示例XML,解析器正确运行。
Extensible Markup Language (XML) 1.0 (Fifth Edition) §2.1 Well-Formed XML Documents
只有一个元素,称为根或文档元素
解析第一个<users>…</users>
元素后,文档已完成,解析器停止。
要获得XML文档中的内容列表,必须将它们包装在外部元素中。
<allusers>
<users>
<username>nothan</username>
<score>1000</score>
</users>
<users>
<username>nothan</username>
<score>1000</score>
</users>
</allusers>
答案 1 :(得分:0)
当调用解析器foundCharacters方法时,将检查int计数。如果它为零,则替换数组中的第一个条目,并递增计数。在下一次调用此方法时,count不为零,因此不会替换任何内容,然后将count设置回零。对于下一次调用此方法,计数为零.....依此类推。
还要记住,当从网上检索的数据足够大以通过tcp / ip分割成块时,initWithContentsOfURL可能不会返回所有数据。最好使用NSURLConnection将接收的数据构建为NSData对象,然后将其传递给解析器。另外,对于给定元素,可能会有多个对foundCharacters的调用,因此应该构建接收的元素,并且应该在委托的didEndElement方法中完成放入数组。