0

XMLファイルを解析していますが、XMLは次のようになっています。

<List>
<CompanyallProvidersList>
    <CityDetails>
           <City>NewYork</City>
            <Id>1</Id>
    </CityDetails>
    <StateDetails>
            <State>Alabaster</State>
      </StateDetails>
    <CityDetails>
             <City>Newyork</City>
              <Id>1</Id>
    </CityDetails>
 <StateDetails>
               <State>California</State>
       </StateDetails>
 </CompanyallProvidersList>
</List>

私のパーサーコードは次のようなものです。

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


if([elementName isEqualToString:@"CompanyallProvidersList"])
{
arr=[[NSMutableArray alloc] init];
drr=[[NSMutableDictionary alloc] init];
}
srr=[[NSMutableString alloc] init];
} 


-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
[srr appendString:string];
}


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

if([elementName isEqualToString:@"City"])
{

[drr setObject:srr forKey:@"City"];
[srr release],srr=nil;
return;
} 

if([elementName isEqualToString:@"Id"])
{

[drr setObject:srr forKey:@"Id"];
[srr release],srr=nil;
return; 
}

if([elementName isEqualToString:@"State"])
{

[drr setObject:srr forKey:@"State"];
[srr release],srr=nil;
return;
}


if([elementName isEqualToString:@"CompanyallProvidersList"])
{
[arr addObject:drr];
[drr release],drr=nil;
}
[srr release],srr=nil;

}

私の出力は次のようになります。

NewYork
1
California

しかし、私は出力を次のようにしたいと思います:

 NewYork
 1
 Alabaster

NewYork
1
California

「私はそれを得ることができませんでした..私はどこで間違っているのですか?

助けていただければ幸いです......

ありがとう....

4

1 に答える 1

0

コードの問題では、同じキーに 2 つの値を追加しています。したがって、2 番目の値が 1 番目の値に置き換えられます。- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName次のコードをデリゲートに追加する必要があります

if([elementName isEqualToString:@"StateDetails"])
{
  [arr addObject:drr];
}

そして変更:

if([elementName isEqualToString:@"CompanyallProvidersList"])
{
[drr release];
}

また、次のコードを- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict

if([elementName isEqualToString:@"CityDetails"])
{
   drr=[[NSMutableDictionary alloc] init];
}

うまくいきます!!!

コードは次のようになります。

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{    
  if([elementName isEqualToString:@"CompanyallProvidersList"])
  {
     arr=[[NSMutableArray alloc] init];
     drr=[[NSMutableDictionary alloc] init];
  }
  if([elementName isEqualToString:@"CityDetails"])
  {
     drr=[[NSMutableDictionary alloc] init];
  }
  srr=[[NSMutableString alloc] init];
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString    *)namespaceURI qualifiedName:(NSString *)qName
{
  if([elementName isEqualToString:@"City"])
  {
    [drr setObject:srr forKey:@"City"];
    [srr release],srr=nil;
    return;
  } 

  if([elementName isEqualToString:@"Id"])
  {

    [drr setObject:srr forKey:@"Id"];
    [srr release],srr=nil;
    return; 
  }

  if([elementName isEqualToString:@"State"])
  {
    [drr setObject:srr forKey:@"State"];
    [srr release],srr=nil;
    return;
  }

   if([elementName isEqualToString:@"StateDetails"])
   {
     [arr addObject:drr];
   }

  if([elementName isEqualToString:@"CompanyallProvidersList"])
  {
     [drr release],drr=nil;
  }
  [srr release],srr=nil;
}
于 2012-09-29T11:29:15.383 に答える