我有一个XML解析器,我想在它转到app delegate之前修剪空格和新行。我知道它只适用于字符串,但如何对象内部的元素。 更重要的是这样做是否明智,或者更好地进行单独的修剪
newString =[menu.enable stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
答案 0 :(得分:3)
在
- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
NSString *trimmedValue=[currentElementValue stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
//NSLog(@"current value:%@",currentElementValue);
[aFile setValue:trimmedValue forKey:elementName];
}
它将修剪每个元素,然后将其保存到对象中。这里,aFile是对象
答案 1 :(得分:1)
我自己也遇到了这个问题,并不是一件轻而易举的事。 SriPriya的解决方案有效,但前提是元素内容中没有换行符。这样:
<foo>
hello
hi
</foo>
将(IIRC)作为出现
@"hello\n hi"
以这种方式修剪。
我提出解决这个问题的解决方案(并且可能有更优雅的解决方案 - 我很满意)如下:
假设您正在使用NSXMLParser和一个处理实际解析的委托类(如上面的SriPriya示例),-parser:foundCharacters:
方法所在的位置,您可以这样做:
- (NSString *)removeNewlinesAndTabulation:(NSString *)fromString appending:(BOOL)appending
{
NSArray *a = [fromString componentsSeparatedByString:@"\n"];
NSMutableString *res = [NSMutableString stringWithString:appending ? @" " : @""];
for (NSString *s in a) {
s = [s stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
if (s.length > 0
&& res.length > (appending ? 1 : 0)) [res appendString:@" "];
[res appendString:s];
}
return res;
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
if (! currentElementValue) {
currentElementValue = [[NSMutableString alloc] initWithString:[self removeNewlinesAndTabulation:string appending:NO]];
} else {
[currentElementValue appendString:[self removeNewlinesAndTabulation:string appending:currentElementValue.length > 0]];
}
}
我知道这看起来很像很简单的代码,但它会正确转向
<foo>
hi there all
i am typing some
stuff
</foo>
到
@"hi there all i am typing some stuff"
这听起来像你正在寻找的。 p>