获取XML子元素 - 包括标签名称

问题描述:

我试图分析在iPhone上使用NSXMLParser一些XML。获取XML子元素 - 包括标签名称

当我发现我想要的元素,我想拥有的一切是开始元素和结束元素之间

例如,给定:

<A> 
    <K> 
     <C> 
      <D>dddd</D> 
     </C> 
     <E> eeee </E> 
    </K> 
    <F> ffff </f> 
</A> 

我想指定ķ

和接收:

<C> 
     <D> dddd </D> 
    </C> 
    <E> eeee </E> 

然而,目前的NSXMLParser忽略所有的<>和属性。 我在委托方法中放入了什么,以确保我在指定的标签之间获得所有内容?

这是我现在所拥有的:提前

//---when the start of an element is found--- 
-(void) parser:(NSXMLParser *) parser didStartElement:(NSString *) elementName namespaceURI:(NSString *) namespaceURI qualifiedName:(NSString *) qName attributes:(NSDictionary *) attributeDict { 

    if([elementName isEqualToString:@"ns11:createNewPrincipalResponse"]) 
    { 
     elementFound = YES; 
     NSLog(@"PrincResp FOUND"); 
    } 
} 


-(void)parser:(NSXMLParser *) parser foundCharacters:(NSString *)string 
{ 
    if (elementFound) 
    { 
     [parseResults appendString: string]; 
    } 
} 


//---when the end of element is found--- 
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 

    if ([elementName isEqualToString:@"ns11:createNewPrincipalResponse"]) 
    { 
     //---displays the country--- 
     NSLog(@"\n******************\nParse Results...\n*************\n\n%@",parseResults); 
     [parseResults setString:@""]; 
     token = [NSString stringWithString:parseResults]; 
     elementFound = FALSE; 
    } 
} 

谢谢!

您可能可以使用columnNumber,lineNumber解析器的方法来获取元素开始的位置(即,将它们存储为您在查找的元素的didStartElement中的column1,line1),然后当该元素结束时,在didEndElement中, column2和line2,然后将原始XML中的文本从(line1,column1)剪切为(line2,column2)。

相当哈克,但它可能会工作。

编辑:提取文本,你可以做这些方针的东西:如果元素开始/时解析器的位置结束

__block int lineNumber = 0; 
__block NSMutableString* result = [NSMutableString stringWithCapacity:100]; 

[str enumerateLinesUsingBlock:^(NSString* line, BOOL* stop) { 

if(lineNumber == line1) { 
    [result appendString:[line substringFromIndex:column1]]; 
} 
if(lineNumber > line1 && lineNumber < line2) [result appendString:line]; 

if(lineNumber == line2) { 
    [result appendString:[line substringToIndex:column2]]; 
} 
lineNumber++; 
if(lineNumber > line2) *stop = YES; 

}]; 

我不知道是在开始或在元素的结尾 - 您可能需要自己跳过它,或者如果位置在元素的末尾,请检查column1/column2是否不在该行之外(在这种情况下,不添加任何内容)。另外,如果你需要保留换行符,你需要他们自己添加(而不是appendString:STR使用appendFormat:“%@ \ n”,STR)

+0

好的,我成功地获得了列和行号,任何想法我可以使用哪种方法从某个列和行提取子字符串到另一列和行? – klyngbaek 2011-04-05 17:07:43

+0

在已编辑的答案中看到一个示例 – SVD 2011-04-05 17:40:29

+0

谢谢。你的代码可以做到这一点。然而,或由解析器返回的列和行号不正确的指标:(。它可能有一些做输入到解析器是数据,而上面的代码也适用于字符串。 – klyngbaek 2011-04-05 20:17:15

的NSXMLParser是相当可怕的使用。您是否尝试过使用LibXML进行解析?然后,您可以使用XPath来查询XML,这更简单和更加标准的解析XML文档的方式。

+0

我没有,谢谢你的提示,我会了解更多。 – klyngbaek 2011-04-05 16:40:05