仅在使用NSXMLParser的特定标记内解析元素
问题描述:
我只需要解析Trivia标记之间存在的元素。我不需要SAndWin之间的元素。任何帮助表示赞赏。提前致谢。仅在使用NSXMLParser的特定标记内解析元素
在下面的示例格式我只需要从小事标签解析得分,用户名
示例XML格式:
<Top10Score>
<SAndWin>
<Member>
<SCORE>278</SCORE>
<MEM_ID>10</MEM_ID>
<EMAIL>[email protected]</EMAIL>
<USERNAME>prabu govind</USERNAME>
</Member>
<Member>
<SCORE>278</SCORE>
<MEM_ID>10</MEM_ID>
<EMAIL>[email protected]</EMAIL>
<USERNAME>prabu govind</USERNAME>
</Member>
<Member>
<SCORE>278</SCORE>
<MEM_ID>10</MEM_ID>
<EMAIL>[email protected]</EMAIL>
<USERNAME>Name1</USERNAME>
</Member> </SAndWin>
<Member>
<SCORE>278</SCORE>
<MEM_ID>10</MEM_ID>
<EMAIL>[email protected]</EMAIL>
<USERNAME>Name2</USERNAME>
</Member>
<Member>
<SCORE>278</SCORE>
<MEM_ID>10</MEM_ID>
<EMAIL>[email protected]</EMAIL>
<USERNAME>Name3</USERNAME>
</Member>
<Trivia>
<Member>
<SCORE>278</SCORE>
<MEM_ID>44</MEM_ID>
<EMAIL>[email protected]</EMAIL>
<USERNAME>prabu govind</USERNAME>
</Member>
<Member>
<SCORE>278</SCORE>
<MEM_ID>48</MEM_ID>
<EMAIL>[email protected]</EMAIL>
<USERNAME>prabu govind</USERNAME>
</Member>
<Member>
<SCORE>278</SCORE>
<MEM_ID>22</MEM_ID>
<EMAIL>[email protected]</EMAIL>
<USERNAME>Name8</USERNAME>
</Member> </SAndWin>
<Member>
<SCORE>278</SCORE>
<MEM_ID>19</MEM_ID>
<EMAIL>[email protected]</EMAIL>
<USERNAME>Name6</USERNAME>
</Member>
<Member>
<SCORE>278</SCORE>
<MEM_ID>12</MEM_ID>
<EMAIL>[email protected]</EMAIL>
<USERNAME>Name4</USERNAME>
</Member>
</Trivia>
</Top10Score>
答
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解析器像GData XMLParser(我建议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++;
}
}
}
答
需要初始化只有当你发现了一个花絮标签的阵列。并在结束成员标记后将元素添加到数组中。
您必须声明XMLPARSER,AR1,DIC1和curElement在.H文件
-(void)requestXMLParsing
{
NSURL *url = [NSURL URLWithString:URL];
xmlParser = [[NSXMLParser alloc]initWithContentsOfURL:url];
xmlParser.delegate = self;
BOOL success = [xmlParser parse];
if (!success) {
} else {
}
}
的#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
{
}
我使用了标签,它工作正常..感谢您的回答。 – Gowtham
@Gowtham:高兴:) –