Skip to main content

Så här analyserar du XML-filer i Xcode

Gifs With Sound #228 (April 2025)

Gifs With Sound #228 (April 2025)
Anonim

En enkel uppgift som är ryggraden för många appar är möjligheten att analysera XML-filer. Och lyckligtvis gör Xcode det relativt enkelt att analysera en XML-fil i Objective-C.

En XML-fil kan innehålla allt från grundläggande data om din app till ett RSS-flöde för en webbplats. De kan också vara ett bra sätt att uppdatera informationen i din app på distans, och kringgå behovet av att skicka ett nytt binärt till Apple helt enkelt för att lägga till ett nytt objekt på en lista.

Så hur hanterar vi XML-filer i Xcode? Processen innehåller steg för att initialisera de variabler som ska användas, starta XML-parserprocessen, mata den processen en fil, början av ett enskilt element, tecknen (värde) i elementet, slutet på ett enskilt element och slutet av analyseringsprocessen.

I det här exemplet analyserar vi en fil från Internet genom att skicka den till en viss webbadress (URL).

Vi börjar med att bygga upp huvudfilen. Detta är ett exempel på en mycket grundläggande headerfil för en detaljvisningskontrollör med minimikraven för att analysera vår fil:

@interface RootViewController: UITableViewController {DetailViewController * detailViewController;NSXMLParser * rssParser;NSMutableArray * artiklar;NSMutableDictionary * item;NSString * currentElement;NSMutableString * ElementValue;BOOL errorParsing;}@property (nonatomic, behåll) IBOutlet DetailViewController * detailViewController;- (tom) parseXMLFileAtURL: (NSString *) URL;Funktionen parseXMLFileAtURL startar processen för oss. När det är klart kommer NSMutableArray "articles" att hålla våra data. Arrayen kommer att bestå av mutable ordböcker med nycklar relaterade till fältnamnen i XML-filen.

Nu när vi har ställt in de nödvändiga variablerna, fortsätter vi vidare till mötet med processen i .m-filen:

- (void) parserDidStartDocument: (NSXMLParser *) parser {NSLog (@ "Filen hittades och parsing startade");}

Denna funktion körs i början av processen. Det finns inget behov av att sätta något i den här funktionen, men om du vill utföra en uppgift när filen börjar analyseras, så här anger du din kod.

- (tom) parseXMLFileAtURL: (NSString *) URL{NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-oss) AppleWebKit / 525.27.1 (KHTML, som Gecko) Version / 3.2.1 Safari / 525.27.1";NSMutableURLRequest * request = NSMutableURLRequest requestWithURL:NSURL URLWithString: URL;request setValue: agentString forHTTPHeaderField: @ "User-Agent";xmlFile = NSURLConnection sendSynchronousRequest: request returningResponse: nil error: nil;artiklar = NSMutableArray alloc init;errorParsing = NR;rssParser = NSXMLParser allokera initWithData: xmlFile;rssParser setDelegate: self;// Du kan behöva aktivera några av dessa beroende på vilken typ av XML-fil du analyserarrssParser setShouldProcessNamespaces: NO;rssParser setShouldReportNamespacePrefixes: NO;rssParser setShouldResolveExternalEntities: NO;rssParser parse;}

Den här funktionen instruerar motorn att hämta en fil på en viss webbadress (URL) och starta processen för att analysera den. Vi berättar för den fjärranslutna servern att vi är en Safari som körs på Mac bara om servern försöker omdirigera iPhone / iPad till en mobilversion.Alternativen i slutet är specifika för vissa XML-filer. De flesta RSS-filer och generiska XML-filer behöver inte de aktiveras.

- (void) parser: (NSXMLParser *) parser parseErrorOccurred: (NSError *) parseError {NSString * errorString = NSString stringWithFormat: @ "Felkod% i", parseError code;NSLog (@ "Fel parsing XML:% @", errorString);errorParsing = JA;}Det här är en enkel felkontrollrutning som anger ett binärt värde om det stöter på ett fel. Du kanske behöver något mer specifikt här beroende på vad du gör. Om du helt enkelt behöver köra någon kod efter bearbetning vid fel kan den binära variabeln ErrorParsing kallas vid den tiden.

- (void) parser: (NSXMLParser *) parser didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName attribut: (NSDictionary *) attributDict {currentElement = elementName copy;ElementValue = NSMutableString alloc init;om (elementName isEqualToString: @ "item") {item = NSMutableDictionary alloc init;}} Köttet i XML-parsern innehåller tre funktioner, en som körs i början av ett enskilt element, en som körs under mitten av analysering av elementet och en som körs i slutet av elementet.

I det här exemplet kommer vi att analysera en fil som liknar RSS-filer som bryter ner element i grupper under rubriken "objekt" i XML-filen. I början av behandlingen söker vi efter elementnamnet "objekt" och fördelar vår artikelordlista när en ny grupp detekteras. Annars initierar vi vår variabel för värdet.

- (void) parser: (NSXMLParser *) parser foundCharacters: (NSString *) sträng {ElementValue appendString: string;}

Det här är den lätta delen. När vi hittar tecken lägger vi dem enkelt till vår variabel "ElementValue".

- (void) parser: (NSXMLParser *) parser didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {om (elementName isEqualToString: @ "item") {artiklar addObject: item copy;} annat {item setObject: ElementValue forKey: elementName;}}

När vi har bearbetat ett element måste vi göra en av två saker: (1) om endelementet är "objekt", har vi gjort vår grupp, så vi lägger till vår ordlista i vår serie av "artiklar" ". Eller (2) om elementet inte är "objekt" lägger vi värdet i vår ordlista med en nyckel som matchar elementets namn. (Det betyder att vi inte behöver en enskild variabel för varje fält i XML-filen. Vi kan bearbeta dem lite mer dynamiskt.)

- (void) parserDidEndDocument: (NSXMLParser *) parser {om (errorParsing == NO){NSLog (@ "XML-bearbetning gjort!");} annat {NSLog (@ "Fel uppstod under XML-bearbetningen");}}

Det här är den sista funktionen som behövs för vår analyseringsrutin. Det slutar helt enkelt dokumentet. Du lägger någon kod du vill avsluta processen här eller något speciellt du kanske vill göra vid fel.

En sak som många appar kanske vill göra här är att spara data och / eller XML-filen till en fil på enheten. På det sättet, om användaren inte är ansluten till Internet nästa gång de laddar appen, kan de fortfarande få den här informationen.

Naturligtvis kan vi inte glömma den viktigaste delen: berätta för din ansökan att analysera filen (och ge den en webbadress för att hitta den på!).

För att starta processen behöver du helt enkelt lägga till den här raden av kod till lämplig plats där du vill göra XML-bearbetningen:

själv parseXMLFileAtURL: @ "http://www.webaddress.com/file.xml";