Paano Parse XML Files sa Xcode

Ang isang simpleng gawain na ang katigasan ng loob sa maraming apps ay ang kakayahan upang mai-parse ang mga XML file. At, sa kabutihang-palad, ginagawang madali ng Xcode na ma-parse ang isang XML file sa Layunin-C.

Ang isang XML file ay maaaring maglaman ng anumang bagay mula sa pangunahing data tungkol sa iyong app sa isang RSS feed para sa isang website. Maaari rin silang maging isang mahusay na paraan ng pag-update ng impormasyon sa loob ng iyong app mula sa malayo, kaya bypassing ang pangangailangan upang magsumite ng isang bagong binary sa Apple upang magdagdag ng isang bagong item sa isang listahan.

Ang proseso ay naglalaman ng mga hakbang para sa pagsisimula ng mga variable na gagamitin, simula sa proseso ng parser ng XML, pagpapakain sa proseso ng isang file, ang simula ng isang indibidwal na elemento, ang mga character (halaga) sa loob ng elemento, ang dulo ng isang indibidwal na sangkap, at ang dulo ng proseso ng pag-parse.

Sa halimbawang ito, parsing namin ang isang file mula sa Internet sa pamamagitan ng pagpasa nito ng isang partikular na web address ( URL ).

Magsisimula tayo sa pagbuo ng header ng file. Ito ay isang halimbawa ng isang napaka pangunahing file ng header para sa isang Detalye View Controller na may pinakamababang mga kinakailangan para sa pag-parse ng aming file:

@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;

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

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

- (walang laman) parseXMLFileAtURL: (NSString *) URL;

Ang parseXMLFileAtURL function ay magsisimula ng proseso para sa amin. Kapag natapos na ito, ang mga "artikulo" ng NSMutableArray ay hahawakan ang aming data. Ang array ay binubuo ng hindi nababago na mga diksyunaryo na may mga susi na may kaugnayan sa mga pangalan ng patlang sa XML file.

Ngayon na na-set up na namin ang mga variable na kailangan, magpapadala kami sa pagkita ng proseso sa .m file:

- (walang laman) parserDidStartDocument: (NSXMLParser *) parser {
NSLog (@ "Natuklasan at na-parse ang file na nagsimula");

}

Ang function na ito ay tumatakbo sa simula ng proseso. Hindi na kailangang maglagay ng anumang bagay sa function na ito, ngunit kung nais mong magsagawa ng isang gawain kapag ang file ay nagsisimula na ma-parse, ito ay kung saan mo ilalagay ang iyong code.

- (walang laman) parseXMLFileAtURL: (NSString *) URL
{

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


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

rssParser = [[NSXMLParser alloc] initWithData: xmlFile];
[rssParser setDelegate: self];

/ / Maaaring kailanganin mong buksan ang ilan sa mga ito depende sa uri ng XML file na iyong pag-parse
[rssParser setShouldProcessNamespaces: HINDI];
[rssParser setShouldReportNamespacePrefixes: HINDI];
[rssParser setShouldResolveExternalEntities: HINDI];

[rssParser parse];

}

Ang instrumento na ito ay nagtuturo sa engine upang mag-download ng isang file sa isang partikular na web address (URL) at simulan ang proseso para sa pag-parse ito.

Sinasabi namin ang remote server na kami ay isang Safari na tumatakbo sa Mac kung sakaling sinusubukan ng server na i-redirect ang iPhone / iPad sa isang mobile na bersyon.

Ang mga pagpipilian sa dulo ay tiyak sa ilang mga XML file. Karamihan sa mga file na RSS at generic na mga file ng XML ay hindi kailangan ang mga ito na naka-on.

- (walang laman) parser: (NSXMLParser *) parser parseErrorOccurred: (NSError *) parseError {

NSString * errorString = [NSString stringWithFormat: @ "Error code% i", [parseError code]];
NSLog (@ "Error sa pag-parse ng XML:% @", errorString);


errorParsing = OO;
}

Ito ay isang simpleng error-checking routing na magtatakda ng binary value kung nakatagpo ito ng error. Maaaring kailanganin mo ang isang bagay na mas tukoy dito depende sa iyong ginagawa. Kung kailangan mo lang magpatakbo ng ilang mga code pagkatapos ng pagproseso sa kaso ng error, ang errorParsing binary variable ay maaaring tawagin sa oras na iyon.

- (void) parser: (NSXMLParser *) parser didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName attributes: (NSDictionary *) attributeDict {
currentElement = [elementName copy];
ElementValue = [[NSMutableString alloc] init];
kung ang ([elementName isEqualToString: @ "item"]) {
item = [[NSMutableDictionary alloc] init];

}

}

Ang karne ng XML parser ay naglalaman ng tatlong mga function, isa na tumatakbo sa simula ng isang indibidwal na elemento, isa na tumatakbo sa panahon ng gitna ng pag-parse ng elemento, at isa na tumatakbo sa dulo ng elemento.

Para sa halimbawang ito, parsing namin ang isang file na katulad ng mga file ng RSS na nagbabagsak ng mga elemento sa mga grupo sa ilalim ng heading ng "mga item" sa loob ng file na XML. Sa simula ng pagproseso, sinusuri namin ang "item" na pangalan ng elemento at inilalaan ang aming diksyunaryo ng item kapag natagpuan ang isang bagong grupo. Kung hindi, pinasimulan namin ang aming variable para sa halaga.

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

Ito ang madaling bahagi. Kapag nakita namin ang mga character, idagdag lamang namin ang mga ito sa aming variable na "ElementValue".

- (walang laman) parser: (NSXMLParser *) parser didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {
kung ang ([elementName isEqualToString: @ "item"]) {
[mga artikulo addObject: [kopya ng item]];
} else {
[item setObject: ElementValue forKey: elementName];
}

}

Kapag natapos na namin ang pagproseso ng isang elemento, kailangan naming gawin ang isa sa dalawang bagay: (1) kung ang elementong pangwakas ay "item", natapos na namin ang aming grupo, kaya idaragdag namin ang aming diksyunaryo sa aming hanay ng mga "artikulo ".

O (2) kung ang elemento ay hindi "item", itatakda namin ang halaga sa aming diksyunaryo gamit ang isang key na tumutugma sa pangalan ng elemento. (Nangangahulugan ito na hindi namin kailangan ang isang indibidwal na variable para sa bawat field sa loob ng file na XML. Maaari naming iproseso ang mga ito ng kaunti pang dynamic na.)

- (walang laman) parserDidEndDocument: (NSXMLParser *) parser {

kung (errorParsing == HINDI)
{
NSLog (@ "XML processing done!");
} else {
NSLog (@ "May naganap na error sa panahon ng pagproseso ng XML");
}

}

Ito ang huling pag-andar na kinakailangan para sa aming pag-parse na gawain. Ito ay nagtatapos lamang sa dokumento. Maglalagay ka ng anumang code na nais mong tapusin ang proseso dito o anumang espesyal na maaaring gusto mong gawin sa kaso ng error.

Ang isang bagay na maaaring nais gawin ng maraming apps dito ay upang i-save ang data at / o XML file sa isang file sa device. Sa ganoong paraan, kung ang user ay hindi nakakonekta sa Internet sa susunod na pag-load nila ang app, maaari pa rin nilang makuha ang impormasyong ito.

Siyempre, hindi namin makalimutan ang pinakamahalagang bahagi: nagsasabi sa iyong application na ma-parse ang file (at binibigyan ito ng isang web address upang hanapin ito sa!).

Upang simulan ang proseso, kailangan mo lamang idagdag ang linyang ito ng code sa naaangkop na lugar kung saan mo gustong gawin ang XML processing:

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