2011-02-25 22 views
11

Bir XML dizesi alan ve bir NSDictionary uygulamasına neden olan bir blog yazarı tarafından yazılmış bir sınıf kullanıyorum (http://troybrant.net/blog/).XML okuyucu sınıfında yeni satırlar ve boşluklar

Çok güzel ... mükemmel bir şekilde çalışıyor, çünkü birçok öğe değerinin başında yeni satırların ve beyaz boşluğun garip bir yapılandırmasıyla bitiyor.

Nedenini çözemedim. Sınıfı buraya gönderiyorum, böylece ikinci bir çift göz alabiliyorum ... gördükleri yöntemde herhangi birinin şüpheli olduğunu fark ederse.

// 
// XMLReader.m 
// 

#import "XMLReader.h" 

NSString *const kXMLReaderTextNodeKey = @"text"; 

@interface XMLReader (Internal) 

- (id)initWithError:(NSError **)error; 
- (NSDictionary *)objectWithData:(NSData *)data; 

@end 


@implementation XMLReader 

#pragma mark - 
#pragma mark Public methods 

+ (NSDictionary *)dictionaryForXMLData:(NSData *)data error:(NSError **)error 
{ 
    XMLReader *reader = [[XMLReader alloc] initWithError:error]; 
    NSDictionary *rootDictionary = [reader objectWithData:data]; 
    [reader release]; 
    return rootDictionary; 
} 

+ (NSDictionary *)dictionaryForXMLString:(NSString *)string error:(NSError **)error 
{ 
    NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; 
    return [XMLReader dictionaryForXMLData:data error:error]; 
} 

#pragma mark - 
#pragma mark Parsing 

- (id)initWithError:(NSError **)error 
{ 
    if ((self = [super init])) 
    { 
     errorPointer = error; 
    } 
    return self; 
} 

- (void)dealloc 
{ 
    [dictionaryStack release]; 
    [textInProgress release]; 
    [super dealloc]; 
} 

- (NSDictionary *)objectWithData:(NSData *)data 
{ 
    // Clear out any old data 
    [dictionaryStack release]; 
    [textInProgress release]; 

    dictionaryStack = [[NSMutableArray alloc] init]; 
    textInProgress = [[NSMutableString alloc] init]; 

    // Initialize the stack with a fresh dictionary 
    [dictionaryStack addObject:[NSMutableDictionary dictionary]]; 

    // Parse the XML 
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]; 
    parser.delegate = self; 
    BOOL success = [parser parse]; 

    // Return the stack's root dictionary on success 
    if (success) 
    { 
     NSDictionary *resultDict = [dictionaryStack objectAtIndex:0]; 
     return resultDict; 
    } 

    return nil; 
} 

#pragma mark - 
#pragma mark NSXMLParserDelegate methods 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{ 
    // Get the dictionary for the current level in the stack 
    NSMutableDictionary *parentDict = [dictionaryStack lastObject]; 

    // Create the child dictionary for the new element, and initilaize it with the attributes 
    NSMutableDictionary *childDict = [NSMutableDictionary dictionary]; 
    [childDict addEntriesFromDictionary:attributeDict]; 

    // If there's already an item for this key, it means we need to create an array 
    id existingValue = [parentDict objectForKey:elementName]; 
    if (existingValue) 
    { 
     NSMutableArray *array = nil; 
     if ([existingValue isKindOfClass:[NSMutableArray class]]) 
     { 
      // The array exists, so use it 
      array = (NSMutableArray *) existingValue; 
     } 
     else 
     { 
      // Create an array if it doesn't exist 
      array = [NSMutableArray array]; 
      [array addObject:existingValue]; 

      // Replace the child dictionary with an array of children dictionaries 
      [parentDict setObject:array forKey:elementName]; 
     } 

     // Add the new child dictionary to the array 
     [array addObject:childDict]; 
    } 
    else 
    { 
     // No existing value, so update the dictionary 
     [parentDict setObject:childDict forKey:elementName]; 
    } 

    // Update the stack 
    [dictionaryStack addObject:childDict]; 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    // Update the parent dict with text info 
    NSMutableDictionary *dictInProgress = [dictionaryStack lastObject]; 

    // Set the text property 
    if ([textInProgress length] > 0) 
    { 
     [dictInProgress setObject:textInProgress forKey:kXMLReaderTextNodeKey]; 

     // Reset the text 
     [textInProgress release]; 
     textInProgress = [[NSMutableString alloc] init]; 
    } 

    // Pop the current dict 
    [dictionaryStack removeLastObject]; 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    // Build the text value 
    [textInProgress appendString:string]; 
} 

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError 
{ 
    // Set the error pointer to the parser's error object 
    *errorPointer = parseError; 
} 

@end 

bu rahatsız edici bir sorudur, özür dilerim (ve inadına beni oy etmeyiniz). Sadece burada neler olup bittiğini anlamaya çalışıyorum ve kendimi bulmak için kodlama cesareti eksikliği. (Ben yeniyim Obj-C)

Clif

Çözüm:

Değişim bu satırı:

[dictInProgress setObject:textInProgress forKey:kXMLReaderTextNodeKey]; 

bu hat için:

[dictInProgress setObject:[textInProgress stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] forKey:kXMLReaderTextNodeKey]; 
+0

Hayat koruyucusun, teşekkürler –

cevap

10

Sen Bu sınıfa girdiğiniz değerleri düzeltebilir:

NSString *trimmedValue = [value stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]; 

Bu, önde gelen ve sondaki beyaz alanı kaldıracaktır.

+0

Böyle bir şey deniyordum, ama sinir bozucu kısım şöyle bir değere sahip olacak: "\ n \ n \ n Müthiş Değer". Bu yüzden ben değere varana kadar geçmem gerekiyor. Çok sinir bozucu. Bu senaryo uygun şekilde bu senaryoyu ele alacak mı? (Eğer öyleyse, bu AWESOME ... newLineCharacterSet kullanıyorum ... her neyse fark ettim) – clifgriffin

+0

Bence bu karakter kümesi başlangıçta yeni satırların ve boşlukların herhangi bir kombinasyonu ile başa çıkmalı. Bir deneyin :) –

+0

Harikasınız. Bu harikalar çalıştı. Teşekkür ederim. – clifgriffin