【问题标题】:How to parse multilevel xml in xcode如何在xcode中解析多级xml
【发布时间】:2013-01-05 10:30:53
【问题描述】:

你能帮我解决这个程序吗?我正在尝试解析一个有两个级别的 xml 文件(我不知道这个术语,所以我这样称呼)这是我的 xml 文件的示例

<?xml version="1.0" encoding="UTF-8"?>
<countries>
<country>
    <countryname>Philippines</countryname>
<subsidiaries>
    <subsidiary>
           <name>Sart Philippines Inc.</name>
           <address>Unit 10-A The World Empire Building, 330 Senator Gil Puyat Avenue  Philippines, Philippines</address>
           <phone>+63.2.929</phone>
           <fax>+63.932</fax>
           <email>enquiry.philippines@sarts.com</email>
           <website>http://www.sartorius-mechatronics.com.ph</website>
    </subsidiary>
</subsidiaries>
</country>
<country>
    <countryname>Denmark</countryname>
    <subsidiaries>
        <subsidiary>
           <name>Stedim Nordic A|S</name>
           <address>Hoerskaetten 6d 2630 Taastrup, Denmark</address>
           <phone>+45.7023.4400</phone>
           <fax>+45.4630.4030</fax>
           <email>ne.customersupport@sartorius.com</email>
           <website></website>
        </subsidiary>
        <subsidiary>
           <name>Nordic A|S</name>
           <address>Hoerskaetten 6D 2630 Taastrup, Denmark</address>
           <phone>+45.7523.8700</phone>
           <fax>+45.4130.4020</fax>
           <email>ne.customersupport@sartorius.com</email>
           <website></website>
       </subsidiary>
     </subsidiaries>
   </country>
</countries>

我打算做的是你选择一个国家,然后你选择一个子公司来查看它的信息。我能够解析它,但我无法展示 Stedim Nordic A|S 子公司。

这是我的解析器类

@implementation Parser

-(id)initParser
{
    if (self == [super init])
    {
        app = (AppDelegate *) [[UIApplication sharedApplication]delegate];
    }
    return self;
}

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:    (NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
    if ([elementName isEqualToString:@"countries"])
    {
        app.listArray = [[NSMutableArray alloc]init];

    }
  if ([elementName isEqualToString:@"country"])
    {
        theList = [[List alloc]init];

    }

}

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    if (!currentElementValue)
    {
        currentElementValue = [[NSMutableString alloc]initWithString:string];
    }
    else
    {
        [currentElementValue appendString:string];
    }
}

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

   if ([elementName isEqualToString:@"country"])
    {
        [app.listArray addObject:theList];
    }

    else {

         if ([elementName isEqualToString:@"countryname"]) {
            theList.countryname = currentElementValue;
        }
        if ([elementName isEqualToString:@"name"])
        {
            theList.name = currentElementValue;
        }
        if ([elementName isEqualToString:@"address"])
        {
            theList.address = currentElementValue;
        }
        if ([elementName isEqualToString:@"phone"])
        {
            theList.phone = currentElementValue;
        }
        if ([elementName isEqualToString:@"fax"])
        {
            theList.fax = currentElementValue;
        }
        if ([elementName isEqualToString:@"email"])
        {
            theList.email = currentElementValue;
        }
        if ([elementName isEqualToString:@"website"])
        {
            theList.website = currentElementValue;

      }

       currentElementValue = nil;

    }


}
@end

我不能很好地解释它,但我希望你能帮助我,如果你能给我一个关于这类问题的教程的链接,我真的很感激

【问题讨论】:

  • 创建一个customModelClass的数组,继续读取和创建对象并添加到数组中。检查 didEndElement 是否与 didStartElement 相同......
  • 有什么问题?你做的时候发生了什么?
  • @AKV:他也在做同样的事情,检查[app.listArray addObject:theList];
  • @MidhunMP:他昨天才问了同样的问题。我问他给我们xpath,他又问了同样的问题,我应该为我的xml发布我的解析器吗????但我不能在 cmets 中做到这一点。如果我把它作为答案发布,我会被否决..
  • @MidhunMP :但没有人回答...它只包含 cmets,现在该问题已删除:D

标签: ios objective-c xcode xml-parsing nsxmlparser


【解决方案1】:

你可以递归调用解析器。如果您知道要查找的内容,请搜索它是否可用,如果存在则取其价值。我建议你看看 gdata xml parser

【讨论】:

    【解决方案2】:

    问题是因为在您的第二个 country 元素上有两个 subsidiary。 所以你需要修改你的代码:

    您需要另一个NSString 来持有Country Name。因为您的两个 subsidiary 有一个国家名称元素。

    NSString *temp = nil;
    
    -(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:    (NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
    {
        if ([elementName isEqualToString:@"countries"])
        {
            app.listArray = [[NSMutableArray alloc]init];
    
        }
        if ([elementName isEqualToString:@"subsidiary"])
        {
            theList = [[List alloc]init];
        }
    }
    
    
    -(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:    (NSString *)namespaceURI qualifiedName:(NSString *)qName
    {
    
       if ([elementName isEqualToString:@"subsidiary"])
        {
            theList.countryname = temp;
            [app.listArray addObject:theList];
        }
        else
        {
    
             if ([elementName isEqualToString:@"countryname"])
             {
                temp = currentElementValue;
             }
            if ([elementName isEqualToString:@"name"])
            {
                theList.name = currentElementValue;
            }
            if ([elementName isEqualToString:@"address"])
            {
                theList.address = currentElementValue;
            }
            if ([elementName isEqualToString:@"phone"])
            {
                theList.phone = currentElementValue;
            }
            if ([elementName isEqualToString:@"fax"])
            {
                theList.fax = currentElementValue;
            }
            if ([elementName isEqualToString:@"email"])
            {
                theList.email = currentElementValue;
            }
            if ([elementName isEqualToString:@"website"])
            {
                theList.website = currentElementValue;
            }
            currentElementValue = nil;
        }
    }
    

    【讨论】:

    • 成功了!我现在可以查看“Stedim Nordic A|S”,但它显示两个“丹麦”hmmmmm
    • @Tbt-lionArmanCapistrano:很高兴 :) 感谢您的评论 :)
    • @Tbt-lionArmanCapistrano:因为这两个国家只有一个国家名称。这就是我这样写的原因。
    • 知道如何将它放在表格视图单元格中吗? @Midhum MP
    • 在 cellForRowAtIndexPath 列表中 *t = [app.listArray objectAtIndex:indexPath.row];和 cell.textLabel.text = t.name ;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 2015-05-01
    • 1970-01-01
    相关资源
    最近更新 更多