Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用NSXMLParser仅解析特定标记内的元素_Ios_Nsxmlparser - Fatal编程技术网

Ios 使用NSXMLParser仅解析特定标记内的元素

Ios 使用NSXMLParser仅解析特定标记内的元素,ios,nsxmlparser,Ios,Nsxmlparser,我只需要解析琐事标记之间存在的元素。我不需要SAndWin之间的元素。感谢您的帮助。提前谢谢 在下面的示例格式中,我需要从琐事标记解析Score、Username和only 示例XML格式: <Top10Score> <SAndWin> <Member> <SCORE>278</SCORE> <MEM_ID>10</MEM_ID> <EMAIL>ggg10@gma

我只需要解析琐事标记之间存在的元素。我不需要SAndWin之间的元素。感谢您的帮助。提前谢谢

在下面的示例格式中,我需要从琐事标记解析Score、Username和only

示例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>

278
10
ggg10@gmail.com
普拉布戈文德酒店
278
10
ggg10@gmail.com
普拉布戈文德酒店
278
10
c1@gmail.com
名称1
278
10
a1@gmail.com
姓名2
278
10
b2@gmail.com
名字3
278
44
ggg10@gmail.com
普拉布戈文德酒店
278
48
ggg10@gmail.com
普拉布戈文德酒店
278
22
cname@gmail.com
姓名8
278
19
cname1@gmail.com
名字6
278
12
ename@gmail.com
名字4

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

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

#pragma标记-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
{

}

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

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

#pragma标记-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
{

}
是一个SAX解析器。因此,实现您的需求非常困难(您需要一个标志并不困难)

你可以这样做:

- (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++;
        }
     }
}
在.h文件中声明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解析器(我建议使用DOM解析器来满足这个需求)

如果您使用的是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++;
        }
     }
}
是一个SAX解析器。因此,实现您的需求非常困难(您需要一个标志并不困难)

你可以这样做:

- (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++;
        }
     }
}
在.h文件中声明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解析器(我建议使用DOM解析器来满足这个需求)

如果您使用的是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++;
        }
     }
}

成员元素具有子标签。我需要解析那些标签。。你能建议更多的成员元素有子标签吗。我需要解析那些标签。。你能进一步建议吗more@Gowtham:很高兴:)@Gowtham:很高兴:)