Иако уграђена КСМЛ парсер додаје стварну вредност новој радној површини или мобилној апликацији, кодирање те функционалности обично захтева пуно времена за развој и бета тестирање. Апплеов програм Ксцоде укључује КСМЛ парсер који заобилази већину овог ручног рада.
Ан КСМЛ датотека може садржати било шта, од основних података о вашој апликацији до датотеке РСС феед за веб страницу. Они такође могу бити одличан начин за даљинско ажурирање информација у вашој апликацији, заобилазећи тако потребу да Апплеу пошаљете нови бинарни образац само да бисте додали нову ставку на листу.
Процес Ксцоде
Уграђени Ксцоде процес садржи кораке за иницијализацију променљивих које ће се користити, покретање КСМЛ процеса парсера, додавање тог процеса датотеци, процена појединачних елемената и знакова (вредности) унутар тих елемената, препознавање краја појединачног елемента и завршавање рашчлањивања процес.
Користите КСМЛ парсер
Да бисмо илустровали детаље, анализираћемо пример датотеке са Интернета прослеђујући јој одређену веб адресу (УРЛ).
Почните са изградњом датотеке заглавља. Ово је пример врло основне датотеке заглавља за Детаил Виев Цонтроллер са минималним захтевима за рашчлањивање наше датотеке:
@интерфаце РоотВиевЦонтроллер: УИТаблеВиевЦонтроллер {
ДетаилВиевЦонтроллер * детаилВиевЦонтроллер;
НСКСМЛПарсер * рссПарсер;
НСМутаблеАрраи * чланци;
НСМутаблеДицтионари * итем;
НССтринг * цуррентЕлемент;
НСМутаблеСтринг * ЕлементВалуе;
БООЛ еррорПарсинг;
}
@проперти (нонатомиц, ретаин) ИБОутлет ДетаилВиевЦонтроллер * детаилВиевЦонтроллер;
- (воид) парсеКСМЛФилеАтУРЛ: (НССтринг *) УРЛ;
Функција парсеКСМЛФилеАтУРЛ започиње процес. Када се заврши, НСМутаблеАрраи „чланци“ садрже податке. Низ се састоји од променљивих речника са кључевима повезаним са именима поља у КСМЛ датотеци.
Даље, иницијализујте поступак:
- (воид) парсерДидСтартДоцумент: (НСКСМЛПарсер *) парсер {
НСЛог (@ "Датотека је пронађена и рашчлањивање је започело");
}
Ова функција се покреће на почетку процеса. У ову функцију није потребно ништа стављати, али ако желите да извршите задатак када датотека почне да се рашчлањује, овде бисте ставили свој код.
Упутите програм да нешто преузме
Даље, наложите програму да нешто преузме:
- (воид) парсеКСМЛФилеАтУРЛ: (НССтринг *) УРЛ
{
НССтринг * агентСтринг = @ "Мозилла / 5.0 (Мацинтосх; У; Интел Мац ОС Кс 10_5_6; ен-ус) АпплеВебКит / 525.27.1 (КХТМЛ, попут Гецко) Верзија / 3.2.1 Сафари / 525.27.1 ";
НСМутаблеУРЛРекуест * рекуест = [НСМутаблеУРЛРекуест рекуестВитхУРЛ:
[НСУРЛ УРЛВитхСтринг: УРЛ]];
[захтев сетВалуе: агентСтринг форХТТПХеадерФиелд: @ "Усер-Агент"];
кмлФиле = [НСУРЛЦоннецтион сендСинцхроноусРекуест: захтев за враћањеРеспонсе: нил грешка: нил];
чланци = [[НСМутаблеАрраи аллоц] инит];
еррорПарсинг = НЕ;
рссПарсер = [[НСКСМЛПарсер алоц] инитВитхДата: кмлФиле];
[рссПарсер сетДелегате: селф];
// Можда ћете морати да укључите неке од њих, у зависности од врсте КСМЛ датотеке коју рашчлањујете
[рссПарсер сетСхоулдПроцессНамеспацес: НО];
[рссПарсер сетСхоулдРепортНамеспацеПрефикес: НО];
[рссПарсер сетСхоулдРесолвеЕктерналЕнтитиес: НЕ];
[рссПарсер парсе];
}
Ова функција упућује машину да преузме датотеку на одређену веб адресу (УРЛ) и започне поступак рашчлањивања. Удаљеном серверу кажемо да смо Сафари који ради на Мац-у само у случају да сервер покуша да иПхоне / иПад преусмери на мобилну верзију.
Опције на крају специфичне су за одређене КСМЛ датотеке. Већини РСС датотека и генеричких КСМЛ датотека неће бити потребне.
Проверите грешку
Извршите основну проверу грешака на резултату:
- (воид) парсер: (НСКСМЛПарсер *) парсер парсеЕррорОццурред: (НСЕррор *) парсеЕррор {
НССтринг * еррорСтринг = [НССтринг стрингВитхФормат: @ "Шифра грешке% и", [парсеЕррор цоде]];
НСЛог (@ "Грешка при рашчлањивању КСМЛ-а:% @", еррорСтринг);
еррорПарсинг = ДА;
} Ово рутирање за проверу грешака поставља бинарну вредност ако наиђе на грешку. Овде ће вам можда требати нешто конкретније, у зависности од тога шта радите. Ако једноставно требате покренути неки код након обраде у случају грешке,
Ова рутина провере грешака поставља бинарну вредност ако наиђе на грешку. Овде ће вам можда требати нешто конкретније, у зависности од тога шта радите. Ако једноставно требате покренути неки код након обраде у случају грешке, тада се може позвати бинарна променљива за рашчлањивање грешке.
Анализирајте преузети садржај
Даље, програм преузима преузети садржај и анализира га:
- (воид) парсер: (НСКСМЛПарсер *) парсер дидСтартЕлемент: (НССтринг *) елементНаме намеспацеУРИ: (НССтринг *) намеспацеУРИ куалиННаме: (НССтринг *) кНаме аттрибутес: (НСДицтионари *) аттрибутеДицт {
цуррентЕлемент = [елементНаме цопи];
ЕлементВалуе = [[НСМутаблеСтринг алоц] инит];
иф ([елементНаме исЕкуалТоСтринг: @ "итем"]) {
ставка = [[НСМутаблеДицтионари аллоц] инит];
}
}
Месо КСМЛ парсера садржи три функције, једну која се покреће на почетку појединца елемент, један који се изводи током средине рашчлањивања елемента и један који се изводи на крају елемент.
У овом примеру ћемо рашчланити датотеку сличну РСС датотекама које рашчлањују елементе у групе под насловом предмета унутар КСМЛ датотеке. На почетку обраде проверавамо име елемента „ставка“ и додељујемо наш речник ставки када се открије нова група. У супротном, иницијализујемо нашу променљиву за вредност:
- (воид) парсер: (НСКСМЛПарсер *) парсер фоундЦхарацтерс: (НССтринг *) стринг {
[ЕлементВалуе аппендСтринг: стринг];
}
Када пронађемо знакове, једноставно их додамо нашој променљивој ЕлементВалуе:
- (воид) парсер: (НСКСМЛПарсер *) парсер дидЕндЕлемент: (НССтринг *) елементНаме намеспацеУРИ: (НССтринг *) намесУРИ куалифиедНаме: (НССтринг *) кНаме {
иф ([елементНаме исЕкуалТоСтринг: @ "итем"]) {
[чланци аддОбјецт: [копија предмета]];
} остало {
[итем сетОбјецт: ЕлементВалуе форКеи: елементНаме];
}
}
Шта се дешава када је рашчлањивање завршено
Када програм заврши обраду елемента, мора урадити једну од две ствари:
- Ако је крајњи елемент ставка, Завршили смо групу, па ћемо додати наш речник у наш низ чланака.
- Ако елемент није ставка, вредност ћемо у нашем речнику поставити кључем који се подудара са именом елемента. (То значи да нам није потребна појединачна променљива за свако поље у КСМЛ датотеци. Можемо их обрадити мало динамичније.)
Ово је последња функција потребна за нашу рутину рашчлањивања; завршава документ. Овде ставите било који коначни код или наведите потпрограм за исправљање грешака:
- (воид) парсерДидЕндДоцумент: (НСКСМЛПарсер *) парсер {
ако (еррорПарсинг == НЕ)
{
НСЛог (@ "КСМЛ обрада завршена!");
} остало {
НСЛог (@ "Дошло је до грешке током обраде КСМЛ-а");
}
}
Сачувајте податке
Многе апликације би овде можда желеле да сачувају податке или КСМЛ датотеку у датотеци на уређају. На тај начин, ако уређај следећи пут када се апликација не повеже са Интернетом, и даље може добити ове информације.
Наравно, не можемо заборавити најважнији део: рећи апликацији да рашчлани датотеку (и дати јој веб адресу на којој ће је пронаћи!). Да бисте започели поступак, додајте овај ред кода на одговарајуће место на којем желите да извршите КСМЛ обраду:
[селф парсеКСМЛФилеАтУРЛ: @ " http://www.webaddress.com/file.xml"];