Чтение XML в iPhone - PullRequest
       0

Чтение XML в iPhone

0 голосов
/ 14 мая 2011

У меня есть XML-файл, как показано ниже:

<Statistics>
     <City ID="01">
          <Town ID="04">
               <Person ID="03" Name="Jack">
               </Person>
               <Person ID="04" Name="John">
               </Person>
               <Person ID="05" Name="Peter">
               </Person>
               <Person ID="06" Name="Daniel">
               </Person>
          </Town>
          <Town>
          ...
          </Town>
     </City>
     <City>
     ...
     </City>
</Statistics>

Я хочу прочитать этот XML-файл и создать массив городов. Внутри городских массивов я хочу иметь городские массивы с заданными идентификаторами, а внутри городских массивов я хочу иметь список людей, которых я собираюсь использовать их имена в своем проекте. Система будет выглядеть так: Возвращать людей, которые живут в городе с идентификатором = ".." и в городе с идентификатором = "..." Например: вернуть людей, которые живут в CityID = "01" и TownID = "04" Список будет [Джек, Джон, Питер, Даниэль].

Есть ли способ сделать это в iPhone SDK? Если есть, можете ли вы предложить мне способ сделать это или объяснить, как это сделать самым простым способом, потому что я очень плохо знаком с этой средой.

Большое спасибо за входящие ответы.

Ответы [ 5 ]

10 голосов
/ 14 мая 2011

NSXMLParser - это то, что вы ищете: Ссылка на класс NSXMLParser

Это хороший учебник: Сделайте NSXMLParser вашим другом


Пример кода:
 NSString* XMLString = @"<?xml version=\"1.0\" encoding=\"UTF-8\"?>...";

 NSData* data = [XMLString dataUsingEncoding:NSUTF8StringEncoding]; 

 NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data]

 [parser setDelegate:self]; 
 [parser setShouldProcessNamespaces:NO]; 
 [parser setShouldReportNamespacePrefixes:NO];
 [parser setShouldResolveExternalEntities:NO]; 

 [parser parse]; 

Вам понадобится этот делегат:

 parser:didStartElement:namespaceURI:qualifiedName:attributes:

И используйте переменную attribute типа NSDictionary, чтобы иметь возможность читать атрибуты тега:

 [[attributeDict objectForKey:@"id"] integerValue]
 [attributeDict objectForKey:@"Name"]

Не забудьте добавить протокол NSXMLParserDelegate в ваш класс:

#import <Foundation/Foundation.h>

@interface MyClass : NSObject <NSXMLParserDelegate> {
...
0 голосов
/ 14 мая 2011

Существует несколько вариантов синтаксического анализа XML для iOS SDK. Вот хорошее чтение для того, чтобы прочитать эти варианты:

http://www.raywenderlich.com/553/how-to-chose-the-best-xml-parser-for-your-iphone-project

Ваш вопрос звучит так, как если бы вы хотели использовать XPath. В таком случае TBXML или TouchXML могут быть подходящим вариантом.

0 голосов
/ 14 мая 2011

Если вы можете контролировать XML (вы являетесь владельцем), почему бы не использовать plist (который использует XML btw), а затем получить его как массивы / dicts с [NSArray arrayWithContentsOfFile:] и затем манипулировать структурами NS, как бы выхочу.

0 голосов
/ 14 мая 2011

Вот один пример ...

// RootView.h

@interface RootView : UIViewController <NSXMLParserDelegate> {
    NSXMLParser *xmlParser;
}

// AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    [rootView parseXmlFile:[[NSBundle mainBundle] pathForResource:@"Untitled" ofType:@"xml"]];
}

// RootView.m

- (void)parseXmlFile:(NSString *)pathToFile {
    BOOL success;
    NSURL *xmlURL = [NSURL fileURLWithPath:pathToFile];
    if (xmlParser) // xmlParser is an NSXMLParser instance variable
        [xmlParser release];
    xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];
    [xmlParser setDelegate:self];
    success = [xmlParser parse]; // return value not used
    // if not successful, delegate is informed of error
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {

    if ([elementName isEqualToString:@"City"]) {
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

    if ([elementName isEqualToString:@"City"]) {
    }
}
0 голосов
/ 14 мая 2011

хорошо, лучшее решение - это использовать xml-анализатор по вашему выбору

, если вы новичок в iphone sdk, xcode и т. Д. Почему бы не работать с php и простым xml или xml2array?

длячто тебе нужно?приложение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...