【问题标题】:Parse elements only within certain tag using NSXMLParser使用 NSXMLParser 仅在特定标签内解析元素
【发布时间】:2013-10-04 05:30:59
【问题描述】:

我只需要解析 Trivia 标记之间存在的元素。我不需要 SAndWin 之间的元素。任何帮助表示赞赏。提前致谢。

在下面的示例格式中,我需要从 Trivia Tag 解析分数、用户名

示例 XML 格式:

<Top10Score>
 <SAndWin>
   <Member>
     <SCORE>278</SCORE>
     <MEM_ID>10</MEM_ID>
     <EMAIL>ggg10@gmail.com</EMAIL>
     <USERNAME>prabu govind</USERNAME>
   </Member>
   <Member>
     <SCORE>278</SCORE>
     <MEM_ID>10</MEM_ID>
     <EMAIL>ggg10@gmail.com</EMAIL>
     <USERNAME>prabu govind</USERNAME>
   </Member> 
   <Member>
     <SCORE>278</SCORE>
     <MEM_ID>10</MEM_ID>
     <EMAIL>c1@gmail.com</EMAIL>
     <USERNAME>Name1</USERNAME>
   </Member>    </SAndWin>
   <Member>
     <SCORE>278</SCORE>
     <MEM_ID>10</MEM_ID>
     <EMAIL>a1@gmail.com</EMAIL>
     <USERNAME>Name2</USERNAME>
   </Member>
   <Member>
     <SCORE>278</SCORE>
     <MEM_ID>10</MEM_ID>
     <EMAIL>b2@gmail.com</EMAIL>
     <USERNAME>Name3</USERNAME>
   </Member>
<Trivia>
   <Member>
     <SCORE>278</SCORE>
     <MEM_ID>44</MEM_ID>
     <EMAIL>ggg10@gmail.com</EMAIL>
     <USERNAME>prabu govind</USERNAME>
   </Member>
   <Member>
     <SCORE>278</SCORE>
     <MEM_ID>48</MEM_ID>
     <EMAIL>ggg10@gmail.com</EMAIL>
     <USERNAME>prabu govind</USERNAME>
   </Member> 
   <Member>
     <SCORE>278</SCORE>
     <MEM_ID>22</MEM_ID>
     <EMAIL>cname@gmail.com</EMAIL>
     <USERNAME>Name8</USERNAME>
   </Member>    </SAndWin>
   <Member>
     <SCORE>278</SCORE>
     <MEM_ID>19</MEM_ID>
     <EMAIL>cname1@gmail.com</EMAIL>
     <USERNAME>Name6</USERNAME>
   </Member>
   <Member>
     <SCORE>278</SCORE>
     <MEM_ID>12</MEM_ID>
     <EMAIL>ename@gmail.com</EMAIL>
     <USERNAME>Name4</USERNAME>
   </Member>
</Trivia>
</Top10Score>

【问题讨论】:

    标签: ios nsxmlparser


    【解决方案1】:

    NSXMLParser 是一个 SAX 解析器。所以很难实现你的要求(你需要一个标志并不难)。

    你可以这样做:

    在您的 .h 文件中声明一个 BOOL,例如:

    BOOL 标志;

    并实现解析方法,如:

    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
    {
        flag = false;
        if ([elementName isEqualToString:@"Trivia"])
        {
            flag = true;
        }
    }
    
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    {
        if ([elementName isEqualToString:@"Member"] && flag)
        {
            //read the value here
        }
    }
    

    为了完成类似的任务,最好使用 DOM Parser,例如 GData XMLParser(我推荐 DOM Parser 来满足这个要求)

    如果你使用 GDataXMLParser,你可以这样做:

    - (void)parseMyXML:(NSString *)xml
    {
          GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:[xml dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&error];
        if (doc == nil) { return nil; }
    
        NSArray *members = [doc nodesForXPath:@"//Top10Score/Trivia" error:nil];
        for (GDataXMLElement *member in members)
        {
            int count = 0;
            NSArray *names = [member elementsForName:@"Member"];
            while (names.count >count)
            {
                GDataXMLElement *firstName = (GDataXMLElement *) [names objectAtIndex:0];
                NSLog(@"Value : %@",[[names objectAtIndex:0] stringValue]);
                //store data here
                count++;
            }
         }
    }
    

    【讨论】:

    • @Gowtham:很高兴:)
    【解决方案2】:

    只有在找到 Trivia 标记时才需要初始化数组。并在成员标签结束后将元素添加到数组中。

    您必须在 .h 文件中声明 xmlParser,ar1,dic1 和 curElement

    -(void)requestXMLParsing
        {
    
            NSURL *url = [NSURL URLWithString:URL];
            xmlParser = [[NSXMLParser alloc]initWithContentsOfURL:url];
            xmlParser.delegate = self;
            BOOL success = [xmlParser parse];
            if (!success) {
    
            } else  {
    
            }
        } 
    

    #pragma mark - NSXMLParser 委托

    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
    {
        if ([elementName isEqualToString:@"Trivia"]) {
            ar1 = [[NSMutableArray alloc]init];
        } else if ([elementName isEqualToString:@"Member"]) {
            dic1 = [[NSMutableDictionary alloc]init];
        } 
    
    }
    
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
    {
        curElement = string;
    
    }
    
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
    {
        if ([elementName isEqualToString:@"Member"]) {
            [ar1 addObject:dic1];
        } else if ([elementName isEqualToString:@"Trivia"]) {
            NSLog(@"%@",ar1);
        } else {
            [dic1 setObject:curElement forKey:elementName];
        }
    }
    
    - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError
    {
    
    }
    

    【讨论】:

    • 成员元素有子标签。我需要解析这些标签。你能提供更多建议吗
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    相关资源
    最近更新 更多