Selvom en indbygget XML parser tilføjer reel værdi til en ny desktop- eller mobilapplikation, idet kodning af den funktionalitet typisk kræver meget udviklingstid og beta-test. Apples Xcode-program inkluderer en XML-parser, der omgår det meste af dette manuelle arbejde.
En XML filen kan indeholde alt fra grundlæggende data om din app til en RSS-feed til et websted. De kan også være en fantastisk måde at opdatere information inden for din app eksternt og dermed omgå behovet for at indsende en ny binær til Apple, blot for at tilføje et nyt element til en liste.
Xcode-processen
Den indbyggede Xcode-proces indeholder trin til initialisering af de variabler, der skal bruges, start af XML-parserprocessen, fremføring af den proces en fil, vurdering af individuelle elementer og tegn (værdi) inden for disse elementer, genkendelse af slutningen på et individuelt element og afslutning af parsing behandle.
Brug XML Parser
For at illustrere detaljerne analyserer vi en eksempelfil fra internettet ved at sende den en bestemt webadresse (URL).
Start med at opbygge headerfilen. Dette er et eksempel på en meget grundlæggende headerfil til en Detail View Controller med minimumskravene til parsing af vores fil:
@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;
NSXMLParser * rssParser;
NSMutableArray * artikler;
NSMutableDictionary *-vare;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}
@property (ikke-atomisk, bevar) IBOutlet DetailViewController * detailViewController;
- (ugyldigt) parseXMLFileAtURL: (NSString *) URL;
ParseXMLFileAtURL-funktionen starter processen. Når det er færdigt, indeholder NSMutableArray "artiklerne" dataene. Arrayet består af mutable ordbøger med nøgler relateret til feltnavne i XML-filen.
Initialiser derefter processen:
- (ugyldigt) parserDidStartDocument: (NSXMLParser *) parser {
NSLog (@ "Fil fundet og parsing startet");
}
Denne funktion kører i starten af processen. Der er ikke behov for at sætte noget i denne funktion, men hvis du vil udføre en opgave, når filen begynder at blive parset, er det her, du vil lægge din kode.
Instruer programmet om at downloade noget
Derefter skal du instruere programmet i at downloade noget:
- (ugyldigt) parseXMLFileAtURL: (NSString *) URL
{
NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; da-os) AppleWebKit / 525.27.1 (KHTML, ligesom Gecko) Version / 3.2.1 Safari / 525.27.1 ";
NSMutableURLRequest * anmodning = [NSMutableURLRequest anmodningWithURL:
[NSURL URLWithString: URL]];
[anmodning setValue: agentString forHTTPHeaderField: @ "User-Agent"];
xmlFile = [NSURLConnection sendSynchronousRequest: anmodning returnResponse: nul fejl: nul];
artikler = [[NSMutableArray alloc] init];
errorParsing = NEJ;
rssParser = [[NSXMLParser alloc] initWithData: xmlFile];
[rssParser setDelegate: self];
// Du skal muligvis slå nogle af disse til afhængigt af typen af XML-fil, du analyserer
[rssParser setShouldProcessNamespaces: NO];
[rssParser setShouldReportNamespacePrefixes: NO];
[rssParser setShouldResolveExternalEntities: NO];
[rssParser parse];
}
Denne funktion instruerer motoren i at downloade en fil på en bestemt webadresse (URL) og starte processen til parsing af den. Vi fortæller fjernserveren, at vi er en Safari, der kører på Mac, bare hvis serveren prøver at omdirigere iPhone / iPad til en mobilversion.
Indstillingerne i slutningen er specifikke for visse XML-filer. De fleste RSS-filer og generiske XML-filer behøver ikke at være slået til.
Fejlkontrol af resultatet
Udfør nogle grundlæggende fejlkontrol af resultatet:
- (ugyldig) parser: (NSXMLParser *) parser parseErrorOccurred: (NSError *) parseError {
NSString * errorString = [NSString stringWithFormat: @ "Fejlkode% i", [parseError-kode]];
NSLog (@ "Fejl ved parsing af XML:% @", errorString);
errorParsing = JA;
} Denne fejlkontrolruting indstiller en binær værdi, hvis den støder på en fejl. Du har muligvis brug for noget mere specifikt her afhængigt af hvad du laver. Hvis du simpelthen har brug for at køre noget kode efter behandling i tilfælde af fejl,
Denne fejlkontrolrutine indstiller en binær værdi, hvis den støder på en fejl. Du har muligvis brug for noget mere specifikt her afhængigt af hvad du laver. Hvis du simpelthen har brug for at køre en kode efter behandling i tilfælde af fejl, kan den binære variabelparse kaldes på det tidspunkt.
Analyser det hentede indhold
Derefter nedbryder programmet det hentede indhold og analyserer det:
- (ugyldig) parser: (NSXMLParser *) parser didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI kvalificeret navn: (NSString *) qName attributter: (NSDictionary *) attributeDict {
currentElement = [elementName-kopi];
ElementValue = [[NSMutableString alloc] init];
hvis ([elementName isEqualToString: @ "item"]) {
item = [[NSMutableDictionary alloc] init];
}
}
Kødet i XML-parseren indeholder tre funktioner, en der kører i begyndelsen af en person element, en der kører midt i parsingen af elementet og en der kører i slutningen af element.
I dette eksempel analyserer vi en fil, der ligner RSS-filer, der nedbryder elementer i grupper under overskriften genstande i XML-filen. I starten af behandlingen kontrollerer vi for elementnavnet "element" og tildeler vores vareordbog, når en ny gruppe registreres. Ellers initialiserer vi vores variabel for værdien:
- (ugyldig) parser: (NSXMLParser *) parser fundetTegn: (NSString *) streng {
[ElementValue appendString: string];
}
Når vi finder tegn, tilføjer vi dem blot til vores variabel ElementValue:
- (ugyldig) parser: (NSXMLParser *) parser didEndElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI kvalificeret navn: (NSString *) qName {
hvis ([elementName isEqualToString: @ "item"]) {
[artikler addObject: [elementkopi]];
} andet {
[item setObject: ElementValue forKey: elementName];
}
}
Hvad der sker, når parsing er afsluttet
Når programmet er færdigbehandlet et element, skal det gøre en af to ting:
- Hvis slutelementet er vare, vi er færdige med vores gruppe, så vi tilføjer vores ordbog til vores vifte af artikler.
- Hvis elementet ikke er det vare, indstiller vi værdien i vores ordbog med en nøgle, der matcher elementets navn. (Dette betyder, at vi ikke har brug for en individuel variabel for hvert felt i XML-filen. Vi kan behandle dem lidt mere dynamisk.)
Dette er den sidste funktion, der er nødvendig for vores parseringsrutine; det slutter dokumentet. Sæt en hvilken som helst endelig kode her, eller angiv en fejlkorrigerende underrutine:
- (ugyldigt) parserDidEndDocument: (NSXMLParser *) parser {
hvis (errorParsing == NO)
{
NSLog (@ "XML-behandling færdig!");
} andet {
NSLog (@ "Der opstod en fejl under XML-behandling");
}
}
Gem dataene
En ting, som mange apps måske vil gøre her, er at gemme data eller XML-filen i en fil på enheden. På den måde, hvis enheden ikke har forbindelse til internettet, næste gang appen indlæses, kan den stadig få disse oplysninger.
Vi kan selvfølgelig ikke glemme den vigtigste del: at bede din ansøgning om at analysere filen (og give den en webadresse for at finde den på!). For at starte processen skal du tilføje denne kodelinje til det rette sted, hvor du vil udføre XML-behandlingen:
[selv parseXMLFileAtURL: @ " http://www.webaddress.com/file.xml"];