2011-05-18 37 views
0

我有一个XML解析器,我想在它进入应用程序委托之前修剪空白和新行。我知道它只适用于字符串,但如何为对象内的元素做到这一点。 更重要的是它聪明地做到这一点还是更单独做微调修剪对象中的每一个字符串

newString =[menu.enable stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 
+0

什么是“菜单”? – 2011-05-18 13:33:36

+0

menu.enable是我正在修剪的字符串。使菜单成为字符串所在的对象。不要介意我的代码,这只是一个例子。如何为整个物体做这件事,在我将它们取出之前,每一根线都要修剪掉 – Spire 2011-05-18 15:01:29

+0

所以让我更好地理解这一点。你有一个自定义对象'菜单'的实例,它的属性中有一些是字符串。这些字符串需要修剪。我有这个权利吗? – 2011-05-18 15:04:44

回答

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" 

这听起来就像你在找什么。

+0

我会尝试你的这个解决方案。感谢您的示例代码。还有一件事,你确定NSArray * a = [fromString componentsSeparatedByString:@“\ n”]; 使用新行,因为我试图搜索“/ n”字符,并且没有,但NSLog显示新行中的数据。 – Spire 2011-05-18 15:05:57

+0

也许是因为你在评论中写了“/ n”而不是“\ n”? ;)如果没有,那么我不知道,但上述确实工作。我用它包含换行符的多个XML文件。 – Kalle 2011-05-18 15:12:01

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]; 

} 

将修剪的每一个元素保存到一个对象之前。在这里,文件是对象

+0

谢谢,我会看看这 – Spire 2011-05-18 15:06:56