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>

このコードを使用して、MutableArrayのデータを解析しています

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]);
    }
}

このコードの問題は、1つだけを取得することです

<users> .... </users>このコードを変更して、より多くのユーザーを取得できるようにするにはどうすればよいですか。

よろしくお願いします

4

2 に答える 2

1

上記で投稿したサンプルXMLの場合、パーサーは正しく実行されました。

Extensible Markup Language(XML)1.0(第5版)§2.1整形式のXMLドキュメント

ルートまたはドキュメント要素と呼ばれる要素が1つだけあります

最初の<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カウントがチェックされます。ゼロの場合、配列の最初のエントリが置き換えられ、カウントが増加します。このメソッドの次の呼び出しでは、カウントはゼロではないため、何も置き換えられず、カウントはゼロに戻されます。このメソッドの次の呼び出しでは、カウントはゼロです.....など。

また、ネットから取得されるデータがtcp / ipによってブロックに分割されるのに十分な大きさである場合、initWithContentsOfURLがすべてのデータを返すとは限らないことにも注意してください。NSURLConnectionを使用して、受信したデータをNSDataオブジェクトとして構築し、それをパーサーに渡すことをお勧めします。さらに、特定の要素に対してfoundCharactersへの呼び出しが複数ある可能性があるため、受け取った要素を構築し、配列への配置をデリゲートのdidEndElementメソッドで実行する必要があります。

于 2012-09-23T15:26:47.900 に答える