Xcode менен XML Files Parse кантип

көп колдонмолорго омурткасы бир жөнөкөй милдет XML материалдары талдоо жөндөмдүүлүгү болуп саналат. Ошондой эле, бактыга жараша, ал Xcode Максаты-C үчүн XML билэни талданбай салыштырмалуу жеңил кылат.

An XML билэ учун сиздин колдонмо тууралуу негизги маалыматтар нерсе болушу мүмкүн RSS тоют бир сайт үчүн. Ошондой эле, ошентип эле бир тизме үчүн жаңы пункт менен толукталсын Apple үчүн жаңы бинардык берүү зарылдыгын айланып, алыстан колдонмо ичинде маалыматтарды берүүдөн бир сонун жолу болушу мүмкүн.

Анан кантип биз Xcode менен XML Files иштеп чыгуу керек? Жараяны өзгөрмө демилгеленүүдө үчүн XML талдоочу ишин баштап, пайдаланылышы керек, ал ишти азыктандыруу сөп кадамдарды камтыйт, айрым элементи башталышы, элементтин ичинде каармандар (балл), жеке элементтин аягы жана талдоо жараяны аягы.

Бул мисалда, биз ага белгилүү бир интернет дарегин (өтүп Интернеттен бир билэни талдоодо түзөсүз URL ).

Биз баш сааты чыгып куруу менен баштайбыз. Бул биздин билэни сүйлөм боюнча минималдуу талаптар менен Толугураак кароо башкаруучусу үчүн абдан негизги баш делосуна бир мисалы болуп саналат:

@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
NSMutableArray * буюмдар;
NSMutableDictionary * пункт;
NSString * currentElement;
NSMutableString * ElementValue;
Bool errorParsing;
}

@property (nonatomic, сактап) IBOutlet DetailViewController * detailViewController;

- (күчүн жоготту) parseXMLFileAtURL: (NSString *) URL;

parseXMLFileAtURL милдети бизге жараянын баштайт. Ал аяктаганда, NSMutableArray "макала" Биздин маалыматтарды өткөрөт. Array XML делосуна талаа аттарына байланыштуу баскычтар менен өзгөгүчтүк Сөздүктөр чейин кабыл алынат.

Азыр биз зарыл өзгөрмө койдук деп, биз .м кезекте жараянынын алдынан кетип аласыз:

- (күчүн жоготту) parserDidStartDocument: (NSXMLParser *) Parser {
NSLog ( "File таап, талдоо башталды" @);

}

Бул милдети жараянынын башталышында өтөт. Бул иш боюнча эч нерсе кереги жок, бирок сиз билэ талданбай баштаганда бир тапшырманы аткаруу үчүн келсе, бул сиз кодду салып турган жер.

- (күчүн жоготту) parseXMLFileAtURL: (NSString *) URL
{

NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; Кыргызча-биз) AppleWebKit / 525.27.1 (KHTML, Gecko сыяктуу) котормосу / Safari 3.2.1 / 525.27.1";
NSMutableURLRequest * суроо = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]];
[Суроо макрос: 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) жана аны талдоо үчүн жараянын баштоо үчүн мотор үйрөтөт.

Биз Safari Мак эле учурда иштеп жаткан алыскы Server Server багыттоо аракет кылат айтып жатасыз мулк / кокус уюлдук нускасына.

аягында параметрлери бир XML материалдар менен өзгөчөлөнөт. Көпчүлүк RSS делолору жана жалпы XML делосу аларга бурулуп, тыюу салды да кереги жок болот.

- (күчүн жоготту) талдоочу: (NSXMLParser *) Parser parseErrorOccurred: (NSError *) parseError {

NSString * errorString = [NSString stringWithFormat: @ "Ката коду% I", [parseError коду]];
NSLog ( "талдоо катасы XML:% @" @, errorString);


errorParsing = ООБА;
}

Бул ката туш болсо, экилүү баасын аныктайт жөнөкөй ката-текшерүү багыттама болуп саналат. Сиз эмне кылып жатканын жараша конкреттүү бул жерде бир нерсе керек. сиз жөн гана ката учурда кайра иштетилгенден кийин кээ бир кодду иштетүү үчүн керек болсо, errorParsing бинардык өзгөрүлмө ошол убакта деп атоого болот.

- (күчүн жоготту) талдоочу: (NSXMLParser *) Parser didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName атрибуты: (NSDictionary *) attributeDict {
currentElement = [elementName көчүрмөсү];
ElementValue = [[NSMutableString alloc] ЖМТИ];
эгер ([elementName isEqualToString: @ "пункт"]) {
пункт = [[NSMutableDictionary alloc] ЖМТИ];

}

}

XML Parser эт, үч-милдеттерин, айрым элементи, элементин талдоодо ортосунда учурунда чуркап жылдын башында чуркап бири, жана элементтин аягында чуркап бирин камтыйт.

Бул, мисалы, биз RSS билэлэри XML делосуна ичинде "заттар" деген аталыш менен топторго элементтерди талкалап окшош билэни талдоодо түзөсүз. кайра башталган учурда, биз жаңы топ аныкталды кийин элемент аты "пунктунда" текшерүү жана даана сөздүк бөлүп жатат. Болбосо, биз баалуу үчүн өзгөрмө демилгелейт.

- (күчүн жоготту) талдоочу: (NSXMLParser *) Parser foundCharacters: (NSString *) сап {
[ElementValue appendString: сап];
}

Бул жеңил бир бөлүгү болуп саналат. Биз белгилерди табууга, биз жөн гана биздин өзгөрмөнүн "ElementValue", аларды кошуу.

- (күчүн жоготту) талдоочу: (NSXMLParser *) Parser didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {
эгер ([elementName isEqualToString: @ "пункт"]) {
[Макалалар addObject: [нерсе көчүрүү]];
башка} {
[Пункт setObject: ElementValue forKey: elementName];
}

}

Биз элементин иштеп бүткөндөн кийин, Биз эки нерсенин бирөөнү эмне кылышыбыз керек: (1) акыры элемент "пункт" болсо, анда биз тобу бүткөнчө, ошондуктан биз "макалаларда биздин катарга биздин сөздүк дебеди ".

Же (2) элемент "пункт" жок болсо, анда биз, элементтин аталышын туура келген ачкыч менен сөздүк баасын аласыз. (Бул XML делосуна ичинде ар бир талаа үчүн жеке өзгөрмө кереги жок. Биз дагы динамикалуу түрдө аларды бир аз иштеп алат дегенди билдирет.)

- (күчүн жоготту) parserDidEndDocument: (NSXMLParser *) Parser {

эгер (errorParsing == NO)
{
NSLog ( "XML иштетүү кылган!" @);
башка} {
NSLog ( "Error XML иштетүү учурунда ката кетти" @);
}

}

Бул биздин талдоо улантууга үчүн зарыл болгон акыркы милдети болуп саналат. Ал тек гана документти аяктайт. Сиз ката учурда эмне үчүн каалаган атайын сен бул жерде эч нерсе жараянын аягына чейин каалаган кодду салып аласыз.

Бир нерсе көп колдонмолор бул түзмөктө делосуна маалыматтарды жана / же XML билэни сактап эмес иш кылууга үндөшү мүмкүн. Ошентип, интернетке үчүн колдонмону жүктөп кийинки жолу байланышы жок болсо, алар дагы бул маалымат ала аласыз.

Албетте, биз абдан маанилүү бөлүгүн да эстен чыгарбаш керек: билэни талдоо үчүн арыз айтып (жана ага аны таба желе дарегин берип!).

жараянын баштоо үчүн, жөн гана сен XML иштеп, эмне кылып берейин, ылайыктуу жерге кодексинин бул сапты кошуу керек:

[Алдынча parseXMLFileAtURL: @ "http://www.webaddress.com/file.xml"];