首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSXMLParser示例

NSXMLParser示例
EN

Stack Overflow用户
提问于 2011-01-16 21:26:25
回答 3查看 42.6K关注 0票数 10

我有一个这样的XML

代码语言:javascript
复制
<IS>
    <Value>
        <Signature>-804</Signature>
        <Amount>139</Amount>
    </Value>
    <Value>
        <Signature>-845</Signature>
        <Amount>639466</Amount>
    </Value>
    <Value>
        <Signature>-811</Signature>
        <Amount>16438344</Amount>
    </Value>
    <Value>
        <Signature>-1115</Signature>
        <Amount>-159733</Amount>
    </Value>
</IS>

现在我只想解析其中的特定值。例如,如何获取具有对应签名as -804的节点的值

请帮帮我..

我知道NSXMLParser的基础知识,但不知道如何实现条件解析。

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-16 23:03:45

代码语言:javascript
复制
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
    currentKey = nil;
    [currentStringValue release];
    currentStringValue = nil;
    if([elementName isEqualToString:@"Value"]){
        //alloc some object to parse value into
    } else if([elementName isEqualToString:@"Signature"]){
        currentKey = @"Signature";
        return;
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    if(currentKey){
        if(!currentStringValue){
            currentStringValue = [[NSMutableString alloc] initWithCapacity:200];
        }
        [currentStringValue appendString:string];
    }
}

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    if([elementName isEqualToString:@"Signature"] && [currentStringValue intValue] == 804){
        ivar.signature = [currentStringValue intValue];
        return;
    }
}

就像这样。注意,我还没有在编译器上真正测试过这段代码,所以这里和那里都会有语法错误。

票数 10
EN

Stack Overflow用户

发布于 2011-01-19 03:30:57

您可能希望考虑使用TouchXML - https://github.com/mrevilme/TouchXML,它提供了一些很好的XML处理特性,包括使用XPATH,这使得您想要做的事情变得更加简单。

基于您的模型的一个假设示例:

代码语言:javascript
复制
//first, load an XML document
CXMLDocument *xmlDoc = [[CXMLDocument alloc] initWithXMLString:someXMLString options:0 error:&error];

//get node
CXMLNode *amountNode = [xmlDoc nodeForXPath:@"//Value[@Signature='-804']/Amount" error:&error];

//or get actual value of node
NSSString *amountString =  = [[xmlDoc nodeForXPath:@"//Value[@Signature='-804']/Amount" error:&error] stringValue];

注意:这些exapmles都没有经过测试。

我发现TouchXML非常有用和紧凑。

希望这能有所帮助。

票数 6
EN

Stack Overflow用户

发布于 2011-01-16 21:41:45

解析XML实际上有两种方法--事件驱动的方法(如NSXMLParser所使用的方法)和树方法(如NSXML所使用的方法)。

如果您只想查找特定的元素,那么使用NSXML所使用的树方法可能会容易得多,因为它使您能够使用XPath (甚至是XQuery)查询XML文档,以返回您感兴趣的特定节点等。

如果这听起来可能比使用NSXMLParser遍历整个结构更有成效,那么我建议您阅读Introduction to Tree-Based XML Programming Guide for Cocoa。(“查询XML文档”一节特别值得关注。)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4705588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档