我发现它与解析器本身有关,空格实际上是 XML 文件中的真实空格。
我们有(有)以下设置:
- (void)parser: (NSXMLParser *) parser didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName attributes: (NSDictionary *) attributeDict {
[self setCurrentString: [NSMutableString string]];
}
- (void)parser: (NSXMLParser *) parser foundCharacters: (NSString *) string {
string = [string stringByReplacingOccurrencesOfString: @"\n" withString: @""];
string = [string stringByReplacingOccurrencesOfString: @"\t" withString: @""];
[currentString appendString: string];
}
- (void)parser: (NSXMLParser *) parser didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {
if ([elementName isEqualToString: @"dateOfBirth"]) {
[theObject setDateOfBirth: currentString];
}
// ...
}
现在的问题是,将 分配NSMutableString currentString
给这个对象在这个地方是危险的,因为它会被foundCharacters
方法修改,因为它会在元素结束后继续查找字符。
这里的误解是,可变字符串在分配给对象后不会被修改。
解决方案:当你真的希望它不被修改时,从一个字符串中创建一个不可变的字符串,即使你认为它不会。
- (void)parser: (NSXMLParser *) parser didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {
NSString *parsedString = [NSString stringWithString:currentString]; // non-mutable copy made here
if ([elementName isEqualToString: @"dateOfBirth"]) {
[theObject setDateOfBirth: parsedString];
}
// ...
}