【问题标题】:how to add multiple number of same XML tags when XML parsing in iphone?在iphone中解析XML时如何添加多个相同的XML标签?
【发布时间】:2012-09-29 11:17:25
【问题描述】:

我正在解析一个 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

`我听不懂..我哪里出错了?

任何帮助将不胜感激......

谢谢....

【问题讨论】:

    标签: iphone xcode xml-parsing nsxmlparser


    【解决方案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;
    }
    

    【讨论】:

    • @Mithun 。我有一个小问题,我得到这样的结果:({ City="NewYork"; Id="1"; State=Alabaster;} { City="NewYork";Id= "1";State=California}) 如何从响应中删除所有这些 ({"; 并显示在 2 行的 TableView 中?
    • @cutiepie:告诉我。我认为这个输出来自 NSLog,是吗?
    • @cutiepieL 如果你想从字典中获取数据,请使用objectForKey Like NSMutableDictioanary *dict = [arr objectAtIndex0];[NSLog(@"%@", [dict objectForKey:@"ID"]);
    • 是的 .U r 对...它来自 NSLog ..我希望它在一个有 2 行的 tableView 中,并且在一行之间有一个分隔符..
    • @cutiepie:你检查我上面的评论了吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    相关资源
    最近更新 更多