2011-05-18 65 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