【问题标题】:NSXMLParser exampleNSXMLParser 示例
【发布时间】:2011-01-16 13:26:24
【问题描述】:

我有一个这样的 XML

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

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

请帮帮我..

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

谢谢。

【问题讨论】:

  • 您是否只对特定元素感兴趣,而不是对整个文档内容感兴趣?
  • 是的,我只需要解析特定的节点值(就像我之前所说的那样有条件)
  • 在这种情况下,NSXMLParser 可能不是最符合您要求的 - 请参阅我的答案以获取完整信息。

标签: iphone objective-c nsxmlparser


【解决方案1】:
- (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;
    }
}

类似的东西。 注意我还没有在编译器上真正测试过这段代码,所以这里和那里会有语法错误。

【讨论】:

  • 这对我来说似乎更容易实现。但是我有一个问题......实际上我正在寻找存储在 中与 元素相对应的字符串,即我需要为 获取 -804 的 文本不确定您的示例是否会这样做。
【解决方案2】:

您可能想考虑使用 TouchXML - https://github.com/mrevilme/TouchXML,它提供了一些不错的 XML 处理功能,包括使用 XPATH,这使您尝试做的事情变得更加简单。

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

//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];

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

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

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    解析 XML 有两种有效的方法 - 一种事件驱动的方法(例如 NSXMLParser 使用的方法)和树方法(例如 NSXML 使用的方法)。

    如果您只关注特定元素,那么使用 NSXML 使用的树方法可能会容易得多,因为它使您能够使用 XPath(实际上是 XQuery)查询 XML 文档以返回特定节点,等你感兴趣的东西。

    如果这听起来可能是使用 NSXMLParser 迭代整个结构的更有成效的方法,那么我建议阅读Introduction to Tree-Based XML Programming Guide for Cocoa。 (“查询 XML 文档”部分应该特别有趣。)

    【讨论】:

    • 所以如果我使用 NSXMLm 我可以实现我想要的条件解析。你有什么类似的例子可以作为参考吗?
    • @hmthur 如果您查看我上面链接到的文档的“查询 XML 文档”部分,其中包含代码示例。
    • 只是为了确认一下,所以 NSXML 在 IOS 上可用?见stackoverflow.com/questions/3447993/…
    • @hmthur Arrghh。抱歉 - 它在 iOS 上不可用。在这种情况下,您可能想要使用 libxml(它具有 xpath)。见cocoawithlove.com/2008/10/…
    • libxml 看起来太复杂了,无法使用。我的意思是它是一个基于 C 的 API,与我习惯的 Obj-C 代码非常不同......你有一些使用的参考示例libxml 它做了我正在寻找的类似事情..
    猜你喜欢
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-22
    • 2013-11-16
    • 1970-01-01
    相关资源
    最近更新 更多