Як Разабраць XML файлаў у Xcode

Адна простая задача, якая з'яўляецца асновай для многіх прыкладанняў з'яўляецца магчымасць разбору XML-файлаў. І, на шчасце, Xcode дазваляе параўнальна лёгка разабраць файл XML у Objective-C.

XML файл можа ўтрымліваць што - небудзь з асноўных дадзеных аб вашым дадатку да RSS - канал для вэб - сайта. Яны таксама могуць быць выдатным спосабам абнаўлення інфармацыі ў вашым дадатку выдалена, што пазбаўляе ад неабходнасці прадставіць новы двайковы файл для Apple, каб проста дадаць новы элемент у спіс.

Такім чынам, як мы апрацоўваем XML файлаў у Xcode? Працэс змяшчае крокі для ініцыялізацыі зменных, якія будуць выкарыстоўвацца, пачынаючы працэс сінтаксічнага аналізу XML, падаючы гэты працэс файл, запуск асобнага элемента, сімвалы (значэння) у межах элемента, канец асобнага элемента, і ў канцы працэсу сінтаксічнага аналізу.

У гэтым прыкладзе мы будзем разбору файлаў з Інтэрнэту, перадаючы яму пэўны вэб - адрас ( URL ).

Мы пачнем з пабудовы з загалоўка файла. Гэта прыклад вельмі просты файл загалоўка для Detail View Controller з мінімальнымі патрабаваннямі для разбору наш файл:

@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
NSMutableArray * артыкула;
NSMutableDictionary * пункт;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}

@property (неатомический, захоўвае) IBOutlet DetailViewController * detailViewController;

- (Несапраўднымі) parseXMLFileAtURL: (NSString *) URL;

Функцыя parseXMLFileAtURL пачне працэс для нас. Калі ён заканчвае, «артыкулы» NSMutableArray правядуць нашы дадзеныя. Масіў будзе складацца з змяняных слоўнікаў з ключамі, звязаных з імёнамі палёў у файле XML.

Цяпер, калі мы стварылі неабходныя зменныя, мы пяройдзем да встречанию працэсу ў файле .m:

- (Несапраўднымі) parserDidStartDocument: (NSXMLParser *) аналізатар {
NSLog (@ «знойдзеныя файлы і сінтаксічныя распачалі»);

}

Гэтая функцыя працуе ў пачатку працэсу. Там няма неабходнасці ставіць што-небудзь у гэтай функцыі, але калі вы хочаце, каб выканаць задачу, калі файл пачынае аналізавацца, гэта дзе вы б змясціць ваш код.

- (Несапраўднымі) parseXMLFileAtURL: (NSString *) URL
{

NSString * agentString = @ "Mozilla / 5.0 (compatible; Intel Mac OS X 10_5_6; ан-нас) AppleWebKit / 525.27.1 (KHTML, як Gecko) Version / 3.2.1 Safari / 525.27.1";
NSMutableURLRequest запыт * = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]];
[Запыт SetValue: agentString forHTTPHeaderField: @ "User-Agent"];
XMLFILE = [NSURLConnection sendSynchronousRequest: запыт returningResponse: памылка нуль: нуль];


артыкулы = [[NSMutableArray Alloc] ініцыялізацыі];
errorParsing = NO;

rssParser = [[NSXMLParser Alloc] initWithData: XMLFILE];
[RssParser setDelegate: само];

// Вы, магчыма, спатрэбіцца ўключыць некаторыя з іх у залежнасці ад тыпу файла XML вы разборы
[Ня rssParser setShouldProcessNamespaces: NO];
[Ня rssParser setShouldReportNamespacePrefixes: NO];
няма [rssParser setShouldResolveExternalEntities: NO];

[RssParser сінтаксічнага аналізу];

}

Гэтая функцыя паказвае рухавік загрузіць файл на пэўным вэб-адрас (URL) і пачаць працэс для разбору яго.

Мы гаворым на выдалены сервер , які мы Сафары працуе на Mac толькі ў выпадку , калі сервер спрабуе перанакіраваць iPhone / IPad для мабільнай версіі.

Варыянты ў канцы з'яўляюцца спецыфічнымі для пэўных файлаў XML. Большасць RSS файлы і агульныя файлы XML не будуць мець патрэбу ў іх уключаны.

- (Несапраўднымі) аналізатар: (NSXMLParser *) аналізатар parseErrorOccurred: (NSError *) parseError {

NSString * errorString = [NSString stringWithFormat: @ "Код памылкі% я", [parseError код]];
NSLog (@ "Памылка сінтаксічнага аналізу XML:% @", errorString);


errorParsing = ДА;
}

Гэта простая праверка памылак маршрутызацыі, які будзе ўсталяваны двайковае значэнне, калі ён выяўляе памылку. Магчыма, вам спатрэбіцца нешта больш канкрэтна тут у залежнасці ад таго, што вы робіце. Калі вам проста трэба запусціць код пасля апрацоўкі ў выпадку памылкі, errorParsing бінарная пераменная можа быць выклікана ў той час.

- (Несапраўднымі) аналізатар: (NSXMLParser *) аналізатар didStartElement: (NSString *) ELEMENTNAME NamespaceURI: (NSString *) NamespaceURI QualifiedName: (NSString *) QName атрыбуты: (NSDictionary *) attributeDict {
currentElement = [ELEMENTNAME копія];
ElementValue = [[NSMutableString Alloc] ініцыялізацыі];
калі ([ELEMENTNAME isEqualToString: @ "пункт"]) {
Пункт = [[NSMutableDictionary Alloc] ініцыялізацыі];

}

}

Мяса XML парсер змяшчае тры функцыі, адна з якіх праходзіць у пачатку асобнага элемента, адзін, які праходзіць у сярэдзіне разбору элемента, і той, які праходзіць у канцы элемента.

Для гэтага прыкладу, мы будзем разбор файл, падобнага на RSS файлы, якія расшчапляюць элементы ў групы пад загалоўкам «пункты» у файле XML. У пачатку апрацоўкі, мы правяраем на імя элемента «элемент» і вылучэнне нашага слоўніка пункта, калі новая група выяўленая. У адваротным выпадку, мы ініцыялізуючы нашу зменную для значэння.

- (Несапраўднымі) аналізатар: (NSXMLParser *) аналізатар foundCharacters: (NSString *) радок {
[ElementValue appendString: радок];
}

Гэта лёгкая частка. Калі мы знаходзім сімвалы, мы проста дадаць іх у нашу зменную «ElementValue».

- (Несапраўднымі) аналізатар: (NSXMLParser *) аналізатар didEndElement: (NSString *) ELEMENTNAME NamespaceURI: (NSString *) NamespaceURI QualifiedName: (NSString *) QName {
калі ([ELEMENTNAME isEqualToString: @ "пункт"]) {
[Артыкулы AddObject: [пункт капіяваць]];
} Яшчэ {
[Кропка SetObject: ElementValue forKey: ElementName];
}

}

Калі мы скончылі апрацоўку элемента, нам трэба зрабіць адну з двух рэчаў: (1) калі канчатковы элемент «элемент», мы скончылі нашу групу, таму мы дадамо наш слоўнік у наш масіў «артыкула ».

Або (2), калі элемент не з'яўляецца «пункт», мы ўсталёўваем значэнне ў нашым слоўніку з ключом, які адпавядае імя элемента. (Гэта азначае, што мы не патрэбныя асобныя зменныя для кожнага поля ў файле XML. Мы можам апрацаваць іх няшмат больш дынамічна.)

- (Несапраўднымі) parserDidEndDocument: (NSXMLParser *) аналізатар {

калі (errorParsing == NO)
{
NSLog (@ "апрацоўка XML зроблена!");
} Яшчэ {
NSLog (@ "Памылка пры апрацоўцы XML");
}

}

Гэта апошняя функцыя неабходная для нашага разбору руціна. Гэта проста сканчаецца дакумент. Вы змясціць любы код, які вы хочаце, каб скончыць працэс тут або нічога асаблівага вы можаце захацець зрабіць у выпадку памылкі.

Адна рэч, якую многія прыкладання маглі б хацець зрабіць тут, каб захаваць дадзеныя і / або XML-файла ў файл на прыладзе. Такім чынам, калі карыстальнік не падлучаны да Інтэрнэту, у наступны раз, калі яны загрузіць дадатак, яны ўсё роўна могуць атрымаць на гэтай інфармацыі.

Вядома, мы не можам забываць пра самую важную часткі: казаць прыкладанне для разбору файла (і надаўшы яму вэб-адрас, каб знайсці яго на!).

Для таго, каб пачаць працэс, вам трэба проста дадаць гэты радок кода ў патрэбнае месца, дзе вы хочаце зрабіць апрацоўку XML:

[Само parseXMLFileAtURL: @ "http://www.webaddress.com/file.xml"];