0

我运行一个 XML 解析器,它会遇到类似<tag></tag><tag>content</tag>. 无论哪种方式,它都会存储节点内容以供以后使用。

在其他地方我想检查内容是否为空。我认为一个空节点会是@""或什至(null),但是这些都不正确。

我希望能够确定什么 NSString 代表空节点。NSLogging NSString 会产生某种换行符,但是检查它@"\n"@"\r"显示它不是其中任何一个。

那么有没有办法记录一个 NSString 的实际字符,包括转义序列?就像NSLog(@"\n");会输出"\n"而不是新行一样。

4

2 回答 2

1

Martin 给了你一个例子,说明你可以做些什么来记录字符。或者您可以将其存储在 a 中NSData并以十六进制查看:

NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%@", data);

或者,如果您只想查看 XML 十六进制的控制字符,但保持可打印字符不变,您可以使用CFStringTransform

NSMutableString *mutableString = [string mutableCopy];
CFStringTransform((__bridge CFMutableStringRef)mutableString, NULL, kCFStringTransformToXMLHex, NO);

但是在回答解析器遇到什么时存储什么的问题时<tag></tag>,这完全取决于您如何实现它(如果您有问题,请告诉我们您做了什么)。但是我们大多数人都会在in 中添加字符串,alloc然后将其存储在我们的模型中。在那种情况下,该空标签将产生一个长度为零的可变字符串(例如,除了可变字符串)。你怎么断定它不是?如果您检查了,那应该可以正常工作。initNSMutableStringdidStartElementfoundCharactersdidEndElement@""@""[string isEqualToString:@""]

顺便说一句,如果您想从结果中删除额外的空白,您可以在 indidEndElement中执行以下操作:

self.modelObject.someStringProperty = [self.parsedString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];

这样,如果有任何额外的空格或换行符,它们就会被删除。

于 2013-08-16T22:10:35.003 回答
1

我想到的一个(肮脏的?)技巧是使用NSJSONSerialization 转义所有控制和其他非 ASCII 字符的事实:

NSString *foo = @"a\nb\rc d\t e\001\002";

NSData *json = [NSJSONSerialization dataWithJSONObject:@[foo] options:0 error:NULL];
NSString *escaped = [[NSString alloc] initWithData:json encoding:NSUTF8StringEncoding];
NSLog(@"%@", escaped);

输出:

["a\nb\rc d\te\u0001\u0002"]
于 2013-08-16T22:07:55.910 回答