Unsaon Pag-parse XML nga mga File sa Xcode

Ang usa ka yano nga buluhaton nga mao ang backbone sa daghang mga apps mao ang abilidad sa pag-parse sa mga file sa XML. Ug, maayo kaayo, ang Xcode naghimo nga sayon ​​nga pag-parse sa XML nga file sa Objective-C.

Ang usa ka file sa XML mahimong adunay bisan unsang butang gikan sa nag-unang data bahin sa imong app sa usa ka RSS feed alang sa usa ka website. Mahimo usab kini nga usa ka talagsaong paagi sa pag-update sa impormasyon sulod sa imong app layo, sa ingon dili na kinahanglan nga mosumiter og bag-ong binary ngadto sa Apple aron lang makadugang sa usa ka bag-ong butang sa usa ka lista.

Ang proseso naglakip sa mga lakang sa pagsugod sa mga variables nga gamiton, pagsugod sa proseso sa XML parser, pagpakaon sa proseso nga usa ka file, pagsugod sa usa ka indibidwal nga elemento, ang mga karakter (value) sulod sa elemento, ang katapusan sa usa ka indibidwal nga elemento, ug ang katapusan sa proseso sa pagtapos.

Sa niini nga panig-ingnan, usahon nato ang usa ka file gikan sa Internet pinaagi sa pagpasa niini sa partikular nga address sa web ( URL ).

Magsugod kita sa pagtukod sa header nga file. Kini usa ka ehemplo sa usa ka sukaranan nga header sa file alang sa usa ka Detail View Controller nga adunay minimum nga mga kinahanglanon sa pag-parse sa among file:

@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
Mga artikulo sa NSMutableArray *;
NSMutableDictionary * item;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}

@property (nonatomic, retain) IBOutlet DetailViewController * detailViewController;

- (walay kapuslanan) parseXMLFileAtURL: (NSString *) URL;

Ang parseXMLFileAtURL function magsugod sa proseso alang kanato. Sa diha nga kini mahuman, ang NSMutableArray "mga artikulo" maghupot sa atong datos. Ang han-ay magamit sa mausab nga mga diksyonaryo nga adunay mga yawe nga may kalabutan sa mga ngalan sa field sa XML file.

Karon nga among gipahimutang ang mga kinahanglanon nga kinahanglanon, kami magpadayon sa pagtagbo sa proseso sa .m file:

- (walay sulod) parserDidStartDocument: (NSXMLParser *) parser {
NSLog (@ "Nakit-an ug gisusi ang file");

}

Kini nga kalihokan midagan sa pagsugod sa proseso. Dili kinahanglan nga ibutang ang bisan unsang butang sa niini nga function, apan kon gusto ka nga maghimo sa usa ka tahas sa diha nga ang file magsugod na ma-parse, kini diin imong ibutang ang imong code.

- (walay kapuslanan) parseXMLFileAtURL: (NSString *) URL
Ang

NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit / 525.27.1 (KHTML, sama sa Gecko) Version / 3.2.1 Safari / 525.27.1";
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]];
[hangyo setValue: agentString forHTTPHeaderField: @ "User-Agent"];
xmlFile = [NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil];


Mga artikulo = [[NSMutableArray] init];
errorParsing = NO;

rssParser = [[NSXMLParser alloc] initWithData: xmlFile];
[rssParser setDelegate: sa kaugalingon];

// Mahimong gikinahanglan nimo nga ibalik ang pipila niini depende sa matang sa XML file nga imong pag-parse
[rssParser setShouldProcessNamespaces: NO];
[rssParser setShouldReportNamespacePrefixes: NO];
[rssParser setShouldResolveExternalEntities: NO];

[rssParser parse];

}

Kini nga instruksiyon nagsugo sa makina sa pag-download sa usa ka file sa usa ka partikular nga web address (URL) ug magsugod sa proseso sa pag-parse niini.

Kami nagsulti sa hilit nga server nga kita usa ka Safari nga nagpadagan sa Mac sa higayon nga ang server mosulay sa pag-redirect sa iPhone / iPad ngadto sa usa ka mobile nga bersyon.

Ang mga kapilian sa katapusan maoy piho sa pipila ka mga file sa XML. Kadaghanan sa mga file sa RSS ug mga generic nga mga file sa XML dili kinahanglan nga kini nga mga butang.

- (walay sulod) parser: (NSXMLParser *) parser parseErrorOccurred: (NSError *) parseError {

NSString * errorString = [NSString stringWithFormat: @ "Error code% i", [parseError code]];
NSLog (@ "Error parsing XML:% @", errorString);


errorParsing = YES;
}

Kini usa ka yano nga pagsulbad sa pagsusi sa kasaypanan nga magtakda sa binary nga bili kon kini makasugat og usa ka sayop. Tingali kinahanglan nimo ang usa ka butang nga mas tukma dinhi depende sa imong ginabuhat. Kung gikinahanglan lamang nga modagan sa pipila ka mga code human sa pagproseso sa kaso sa sayup, ang errorParsing binary variable mahimo nga gitawag niadtong panahona.

(NSString *) namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qMga ngalan sa attribute: (NSDictionary *) attributeDict {
currentElement = [elemento nga kopya sa elemento];
ElementValue = [[NSMutableString alloc] init];
kung ((ang elemento mao angEqualToString: @ "item"]) {
item = [[NSMutableDictionary alloc] init];

}

}

Ang karne sa XML parser adunay tulo ka mga gimbuhaton, ang usa nga nagsugod sa sinugdanan sa usa ka indibidwal nga elemento, usa nga midagan sa panahon sa tunga-tunga sa pagtapos sa elemento, ug usa nga nagpadagan sa katapusan sa elemento.

Alang niini nga pananglitan, usahon nato ang usa ka file susama sa mga file sa RSS nga maguba ang mga elemento ngadto sa mga grupo ubos sa ulohan sa "mga butang" sulod sa XML file. Sa pagsugod sa pagproseso, gisusi nato ang elemento nga "butang" nga ngalan ug gigahin ang among mga butang nga diksyonaryo sa diha nga ang usa ka bag-ong grupo nakit-an. Kay kon dili, gisugdan namon ang among mga variable sa bili.

- (walay sulod) parser: (NSXMLParser *) parser foundCharacters: (NSString *) string {
[ElementValue appendString: string];
}

Mao kini ang sayon ​​nga bahin. Kung makakita kita og mga karakter, idugang lamang kini sa atong variable nga "ElementValue".

- (walay sulod) parser: (NSXMLParser *) parser gibuhatEndElement: (NSString *) element nameName nga ngalanURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {
kung ((ang elemento mao angEqualToString: @ "item"]) {
[Mga artikulo addObject: [kopya sa aytem]];
} laing {
[item setObject: ElementValue forKey: elementName];
}

}

Kon natapos na namong pagproseso ang usa ka elemento, kinahanglang buhaton nato ang usa sa duha ka butang: (1) kung ang katapusan nga elemento mao ang "butang", nahuman na ang among grupo, mao nga idugang namon ang among diksyonaryo sa among daghang mga artikulo ".

O (2) kon ang elemento dili "butang", atong ibutang ang bili sa atong diksyonaryo nga adunay usa ka yawe nga katugbang sa ngalan sa elemento. (Kini nagpasabot nga wala kita magkinahanglan sa usa ka indibidwal nga variable sa matag natad sulod sa XML file.

- (walay sulod) parserDidEndDocument: (NSXMLParser *) parser {

kung (errorParsing == WALA)
Ang
NSLog (@ "gibuhat ang XML processing!");
} laing {
NSLog (@ "Ang sayop nahitabo sa panahon sa pagproseso sa XML");
}

}

Kini mao ang katapusan nga katungdanan nga gikinahanglan alang sa atong pagtapos sa rutina. Gitapos lang kini sa dokumento. Ikaw magbutang sa bisan unsa nga code nga gusto nimo nga mahuman ang proseso dinhi o bisan unsa nga espesyal nga mahimo nimo nga buhaton kon adunay sayup.

Usa ka butang nga gusto sa daghan nga mga aplikante dinhi mao ang pagluwas sa datos ug / o XML file ngadto sa usa ka file sa device. Nianang paagiha, kung ang user dili konektado sa Internet sa sunod nga panahon nga ilang load ang app, mahimo gihapon nila makuha kini nga kasayuran.

Siyempre, dili namo makalimtan ang labing importante nga bahin: pagsulti sa imong aplikasyon sa pagsal-ot sa file (ug paghatag niini sa usa ka web address aron makita kini sa!).

Aron masugdan ang proseso, gikinahanglan nga imong idugang kini nga linya sa kodigo sa angay nga dapit diin imong gusto buhaton ang pagproseso sa XML:

[self parseXMLFileAtURL: @ "http://www.webaddress.com/file.xml"];