0

我正在使用 NSXMLParser 解析来自远程服务器的 XML 数据。我按照教程启动并运行,对于我正在创建的对象中的任何 (NSString *) 成员来说一切正常。我还需要从 XML 数据中设置整数,例如:

<root>
    <child>
        <name> Hello </name>
        <number> 123 </number>
    </child>
    <child>
        <name> World</name>
        <number> 456 </number>
    </child>
</root>

在这种情况下,我将创建两个“子”对象。我正在使用:

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
      namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    ...
    [aChild setValue:currentElementValue forKey:elementName];
    ...
}

委托设置值。这就是我遇到问题的地方。“NSString *name”成员每次都设置得很好,但是如果我使用 NSInteger,那么每当我尝试设置“number”时,我都会得到一个 EXC_BAD_ACCESS。所以我尝试使用“int”代替。但是现在我不能使用键值编程,需要手动查找节点:

if([elementName isEqualToString:@"number"]) {
    aChild.number = [currentElementValue intValue]
}

没关系,我可以处理这个问题,因为我知道我将获得哪些节点,但情况会变得更糟。根据教程,当 currentElementValue 是“NSMutableString *”时,即使字符串正确,它也不会返回正确的整数。例如:

    NSLog(@"NSMutableString Value: %@, and intValue %d\n", currentElementValue, [currentElementValue intValue]); 
// Value will be 123 but intValue will be 0

因此,我将 currentElementValue 设为 NSString 而不是 NSMutableString,这样我就可以获得正确的 intValue。但我在网上读到它是 NSMutableString 的原因是:

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

用于设置值的委托可以多次出现,但通常不会出现。所以我的问题是有人知道我做错了什么吗?这对于 NSXMLParser 来说似乎是一个非常微不足道的案例,所以我确定这是我误解的事情。

4

3 回答 3

2

我不知道您的代码在哪里失败,但这是处理此问题的正确方法:

NSMutableString *buffer = [[NSMutableString alloc] init];

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {
    [buffer setString:@""];
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    if([elementName isEqualToString:@"number"]) {
        [aChild setNumber:[buffer intValue]];
        [buffer setString:@""];
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    [buffer appendString:string];
}
于 2009-04-14T12:24:40.993 回答
2
  1. intValue应该和 . 一样NSString工作NSMutableString。你确定 Value 是 '123' 而不是 '\n123' (\n 表示换行符),如果字符串不以十进制数开头,那么intValue将返回 0。

  2. 您是否正确清除了可变字符串parser:didStartElement:?如果您只在那时进行清洁,parser:didEndElement:那么parser:foundCharacters:也会从父元素中收集字符。在这种情况下,它将在您的字符串前面加上换行符,intValue并将返回 0。

  3. 您是正确的,因为parser:foundCharacters:可以为单个元素多次调用。

于 2009-04-14T12:37:48.887 回答
1

这里发生了一些事情。

首先,您的 XML 字符数据中有明显的空白,例如

        <number> 456 </number>

你真的应该去掉那个空格。这可能是导致返回值[NSString intValue]错误的原因。如果您可以从源头上删除它,那就太好了。如果没有,您可以通过执行以下操作在接收端将其剥离:

currentElementValue = [currentElementValue stringByTrimmingCharactersInSet:
    [NSCharacterSet whitespaceAndNewlineCharacterSet]];

您不能使用键/值的原因是您不能将 NSInteger 值存储在 NSMutableDictionary 中。字典中的键和值都必须从 NSObject 继承,而 NSInteger (我在这里猜测)只是一个平台安全的 int 类型定义。所以你应该使用 NSNumber 代替:

NSNumber *theInt = [NSNumber numberWithInt:[currentElementValue intValue]];
[aChild setObject:theInt forKey:elementName];
于 2009-04-16T07:42:44.227 回答