0

我正在向服务器发送查询并使用此代码获得响应

 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>

我正在使用此代码来解析可变数组中的数据

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>如何更改此代码以使其检索更多用户。

此致

4

2 回答 2

1

对于您在上面发布的示例 XML,解析器运行正确。

可扩展标记语言 (XML) 1.0(第五版)§2.1 格式良好的 XML 文档

只有一个元素,称为根或文档元素

解析第一个<users>…&lt;/users>元素后,文档完成,解析器停止。

要在 XML 文档中列出内容,您必须将它们包装在外部元素中。

<allusers>
  <users>
    <username>nothan</username>
    <score>1000</score>                         
  </users>
  <users>
    <username>nothan</username>
    <score>1000</score>                         
  </users>
</allusers>
于 2012-09-23T15:26:56.947 回答
0

当调用解析器 foundCharacters 方法时,会检查 int 计数。如果它为零,则替换数组中的第一个条目,并增加计数。在下一次调用此方法时,count 不为零,因此不会替换任何内容,然后将 count 设置回零。对于此方法的下一次调用,计数为零......等等。

还要记住,当从网上检索到的数据大到足以被 tcp/ip 分成块时,initWithContentsOfURL 可能不会全部返回。最好使用 NSURLConnection 将接收到的数据构建为 NSData 对象,然后将其传递给解析器。此外,对于给定元素,可能会多次调用 foundCharacters,因此应该构建接收到的元素,并且应该在委托的 didEndElement 方法中将其放入数组中。

于 2012-09-23T15:26:47.900 回答