我运行的XML解析器会遇到类似<tag></tag>
或<tag>content</tag>
的内容。无论哪种方式,它都存储节点内容供以后使用。
在其他地方,我想检查内容是否为空。我认为一个空节点可能是@""
甚至(null)
,但这些都不正确。
我希望能够确定NSString代表空节点的内容。 NSLogging NSString导致某种新行,但是对@"\n"
和@"\r"
进行检查显示它不是那些。
那么有没有办法记录NSString的实际字符,包括转义序列?正如NSLog(@"\n");
之类的内容会输出"\n"
而不是新行。
答案 0 :(得分: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\t e\u0001\u0002"]
答案 1 :(得分:1)
Martin给你举例说明了如何记录角色。或者您可以将其存储在NSData
中并以十六进制显示:
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%@", data);
或者,如果您只想查看XML十六进制中的控制字符,但保持可打印字符不变,则可以使用CFStringTransform
:
NSMutableString *mutableString = [string mutableCopy];
CFStringTransform((__bridge CFMutableStringRef)mutableString, NULL, kCFStringTransformToXMLHex, NO);
但是在回答关于解析器遇到<tag></tag>
时存储的内容的问题时,这一切都取决于您如何实现它(并告诉我们如果您有问题,您会采取什么行动)。但我们大多数人alloc
和init
NSMutableString
didStartElement
,我们会在foundCharacters
中追加字符串,然后将其存储在didEndElement
的模型中{1}}。在那种情况下,该空标记将产生零长度可变字符串(例如@""
,除了可变字符串)。你怎么断定它不是@""
?如果您检查了[string isEqualToString:@""]
,那应该没问题。
顺便说一下,如果你想从你的结果中修剪额外的空格,你可以在didEndElement
中执行以下操作:
self.modelObject.someStringProperty = [self.parsedString stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
这样,如果有任何额外的空格或换行符,它们就会被剥离。