2016-09-08 2 views
0

Я хочу загрузить NSDictionary из следующего файла plist, не изменяя его порядок. Plist file
Этот файл plist: Here.
Я много исследовал, и нашел OrderedDictionary и M13OrderedDictionary.
Во-первых, я попробовал NSDictionary (я знаю, что он не)Как загрузить данные из plist без изменения порядка

- (void)testNSDictionary { 
    NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:filePath]; 
    NSLog(@"%@",dictionary); 
} 

Тогда я получил следующий лог:

{ 
    G =  { 
     R =   { 
      H = ""; 
      S = ""; 
     }; 
     V =   { 
      T = ""; 
     }; 
    }; 
    S =  { 
     B =   { 
      L = ""; 
     }; 
     O =   { 
      K = ""; 
      L = ""; 
     }; 
     V =   { 
      T = ""; 
     }; 
    }; 
} 

Это совершенно другой порядок от исходного файла Plist! (Я знаю)
Я думаю, что это алфавитный порядок.
Затем я попытался OrderedDictionary со следующим кодом:

#import "OrderedDictionary.h" 
- (void)testOrderedDictionary { 
    OrderedDictionary *dictionary = [OrderedDictionary dictionaryWithContentsOfFile:filePath]; 
    NSLog(@"%@",dictionary); 
} 

Тогда я получил следующий лог:

{ 
    G =  { 
     R =   { 
      H = ""; 
      S = ""; 
     }; 
     V =   { 
      T = ""; 
     }; 
    }; 
    S =  { 
     B =   { 
      L = ""; 
     }; 
     O =   { 
      K = ""; 
      L = ""; 
     }; 
     V =   { 
      T = ""; 
     }; 
    }; 
} 

А? Это тот же результат, что и NSDictionary.
Наконец, я попробовал M13OrderedDictionary со следующим кодом.

#import "M13OrderedDictionary.h" 
- (void)testM13OrderedDictionary { 
    M13OrderedDictionary *dictionary = [M13OrderedDictionary orderedDictionaryWithContentsOfFile:filePath]; 
    NSLog(@"%@",dictionary); 
} 

Тогда я получил следующий лог:

{ 
} 

Ничего возвратили. Я не понимаю, что происходит.
Я хотел бы знать, как я могу правильно использовать OrderedDictionary и M13OrderedDictionary. Если они устарели, я хочу узнать альтернативный способ разбора файла plist в NSDictionary или NSArray или что-то в этом роде.

Примечание: я не хочу менять файл plist, потому что этот формат является лучшим для меня.

+0

Как вы определяете, что ключи не работают? Вы определяете, какой порядок доступа к ключам в NSDictionary. Если вы хотите использовать набор с определенным порядком, используйте NSArray, а не NSDictionary. –

+0

Я знаю, что NSArray может сохранить порядок, но он не может обладать именем самого NSArray. Например, в этом случае самый глубокий слой T, S, H, T, L, K, L может содержаться NSArray, но другие не могут. Можно ли включить имя массива в NSArray plist? – usingsystem8

+0

Знаете ли вы о '' NSXMLDocument''? Его можно использовать для загрузки любого правильно отформатированного XML-документа (включая plists) в одной строке с API, очень похожим на API NSDictionary' и NSArray' ('' init (URL: ... ''). После того, как у вас есть этот документ в памяти, вы можете выполнять итерацию по его элементам для создания упорядоченного словаря. Или вы можете просто оставить его как экземпляр '' NSXMLDocument'' и использовать силу * xPath * для проанализируйте его. –

ответ

0

Я обнаружил, что сценарий выше, имеет некоторые ошибки.
Я связался с разработчиком OrderedDictionary и, наконец, он сделал функцию импорта и экспорта.
OrderedDictionary v1.4 может импортировать данные OrderedDictionary из файла plist (только формат xml).

Я очень ценю это.

1

A OrderedDictionary не может жить в файле plist. Ну, это может быть в некотором смысле, но не в файле plist, который вы показываете. Файлы Plist знают о NSArray, NSDictionary и некоторых других элементарных классах, которые могут быть элементами этих - и все. Ваш файл plist состоит из NSDictionary, а не OrderedDictionary. Таким образом, вы загрузите обычный NSDictionary, когда вы его загрузите.

Примечание: Я не хочу, чтобы изменить файл Plist, так как этот формат является лучшим для меня

Fine. Но тогда вы собираетесь загружать обычный NSDictionary.

+0

Спасибо. Если я использую xml-файл не plist-файл, можно ли преобразовать xml-данные в nsarray или nsdictionary? – usingsystem8

+0

Абсолютно! Вам нужно будет сделать конвертацию. Но это отличная идея. Конечно, вы могли бы утверждать, что plist _is_ xml-файл, чтобы вы могли сохраняйте свой мат - но опять же, вам придется все разобрать. – matt

+0

Хорошо, но есть ли кто-нибудь, кто уже успел разобрать файл plist? Если никто этого не сделает, я постараюсь разместить его здесь. – usingsystem8

0

Наконец-то мне удалось разобрать мой файл plist с помощью OrderedDictionary. Это мой код:

[ParserDelegate.h]

@interface ParserDelegate : NSObject<NSXMLParserDelegate> 
@end 

[ParserDelegate.m]

#import "ParserDelegate.h" 
#import "OrderedDictionary.h" 
@interface ParserDelegate() 
@end 

@implementation ParserDelegate { 
    BOOL isDict; 
    BOOL isKey; 
    BOOL isString; 
    BOOL stringExists; 
    int layer; 
    int arrayNum; 
    MutableOrderedDictionary *parsedDictionary; 
    MutableOrderedDictionary *tempDictionary; 
    MutableOrderedDictionary *tempTempDictionary; 
    NSMutableArray *keysArray; 
} 

- (void)parserDidStartDocument:(NSXMLParser *)parser { 
    NSLog(@"Started parsing plist file..."); 
    isKey = NO; 
    layer = 0; 
    arrayNum = 0; 
    parsedDictionary = [[MutableOrderedDictionary alloc] init]; 
    tempDictionary = [[MutableOrderedDictionary alloc] init]; 
    tempTempDictionary = [[MutableOrderedDictionary alloc] init]; 
    keysArray = [NSMutableArray array]; 
} 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 
    if ([elementName isEqualToString:@"dict"]) { 
     isDict = YES; 
     layer++; 
    } else if ([elementName isEqualToString:@"key"]) { 
     isKey = YES; 
    } else if ([elementName isEqualToString:@"string"]) { 
     isString = YES; 
     stringExists = NO; 
    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    if (isDict) { 
     if ([tempDictionary count] != 0) { 
      [tempDictionary removeAllObjects]; 
     } 
     isDict = NO; 
    } 
    if (isKey) { 
     [keysArray addObject:string]; 
     arrayNum++; 
    } 
    if (isString) { 
     tempDictionary[[keysArray objectAtIndex:[keysArray count] - 1]] = string; 
     stringExists = YES; 
    } 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 
    if ([elementName isEqualToString:@"dict"]) { 
     layer--; 
     if (layer == 2) { 
      tempTempDictionary[[keysArray objectAtIndex:[keysArray count] - [tempDictionary count] - 1]] = [tempDictionary copy]; 
     } else if (layer == 1) { 
      parsedDictionary[[keysArray objectAtIndex:[keysArray count] - arrayNum]] = [tempTempDictionary copy]; 
      [tempTempDictionary removeAllObjects]; 
      arrayNum = 0; 
     } 
    } else if ([elementName isEqualToString:@"key"]) { 
     isKey = NO; 
    } else if ([elementName isEqualToString:@"string"]) { 
     if (!stringExists) { 
      tempDictionary[[keysArray objectAtIndex:[keysArray count] - 1]] = @""; 
     } 
     isString = NO; 
    } 
} 

-(void)parserDidEndDocument:(NSXMLParser *)parser { 
    NSLog(@"Finished parsing!"); 
    NSLog(@"%@",[parsedDictionary description]); 
} 

@end 

Мне очень жаль, что этот сценарий поддерживает только мой файл Plist, так что другие форматы файлов Plist не может быть проанализирован этим.

Использование:

ParserDelegate *parserDelegate = [[ParserDelegate alloc] init]; 
NSURL *url = [NSURL fileURLWithPath:filePath]; 
NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url]; 
parser.delegate = parserDelegate; 
[parser parse]; 
Смежные вопросы