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

时间:2011-04-05 16:16:08

标签: iphone objective-c xml nsxmlparser

我正在尝试使用iPhone上的NSXMLParser解析一些XML。

当我检测到我想要的元素时,我希望在start元素和end元素之间

例如,给定:

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

我想指定K

并收到:

    <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; 
    }
}

提前致谢!

2 个答案:

答案 0 :(得分:1)

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

非常hacky但它​​可能会有效。

编辑:要提取文本,您可以按照以下方式执行操作:

__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)

答案 1 :(得分:0)

NSXmlParser使用起来相当糟糕。您是否尝试过使用LibXML进行解析?然后,您可以使用XPath来查询XML,这更简单,也是解析XML文档的更标准方法。