Πώς να κάνετε ανάλυση αρχείων XML σε Xcode

Ένα απλό έργο που αποτελεί τη ραχοκοκαλιά πολλών εφαρμογών είναι η δυνατότητα ανάλυσης αρχείων XML. Και, ευτυχώς, το Xcode καθιστά σχετικά εύκολο να αναλύσει ένα αρχείο XML στο Στόχο-C.

Ένα αρχείο XML μπορεί να περιέχει οτιδήποτε από βασικά δεδομένα σχετικά με την εφαρμογή σας σε μια ροή RSS για έναν ιστότοπο. Μπορούν επίσης να είναι ένας πολύ καλός τρόπος ενημέρωσης των πληροφοριών μέσα από την εφαρμογή σας εξ αποστάσεως, παρακάμπτοντας έτσι την ανάγκη να υποβάλετε μια νέα δυαδική στην Apple απλά για να προσθέσετε ένα νέο στοιχείο σε μια λίστα.

Έτσι, πώς επεξεργαζόμαστε τα αρχεία XML στο Xcode; Η διαδικασία περιέχει βήματα για την αρχικοποίηση των μεταβλητών που πρόκειται να χρησιμοποιηθούν, την εκκίνηση της διαδικασίας ανάλυσης XML, την τροφοδοσία που επεξεργάζεται ένα αρχείο, την έναρξη ενός μεμονωμένου στοιχείου, τους χαρακτήρες (value) το τέλος ενός μεμονωμένου στοιχείου και το τέλος της διαδικασίας ανάλυσης.

Σε αυτό το παράδειγμα, θα αναλύσουμε ένα αρχείο από το Διαδίκτυο, διαβιβάζοντάς του μια συγκεκριμένη διεύθυνση ιστού ( URL ).

Θα ξεκινήσουμε με τη δημιουργία του αρχείου κεφαλίδας. Αυτό είναι ένα παράδειγμα ενός πολύ βασικού αρχείου κεφαλίδας για έναν ελεγκτή προβολής λεπτομερειών με τις ελάχιστες απαιτήσεις για την ανάλυση του αρχείου μας:

@interface RootViewController: UITableViewController {
DetailViewController * detailViewController;

NSXMLParser * rssParser;
NSMutableArray * άρθρα;
NSMutableDictionary * στοιχείο;
NSString * currentElement;
NSMutableString * ElementValue;
BOOL errorParsing;
}}

@ ιδιότητα (μη τοματικό, διατήρηση) IBOutlet DetailViewController * detailViewController;

- (κενό) parseXMLFileAtURL: (NSString *) URL;

Η συνάρτηση parseXMLFileAtURL θα ξεκινήσει τη διαδικασία για εμάς. Όταν τελειώσει, τα "άρθρα" του NSMutableArray θα κρατήσουν τα δεδομένα μας. Ο πίνακας θα αποτελείται από μεταβαλλόμενα λεξικά με κλειδιά που σχετίζονται με τα ονόματα πεδίων στο αρχείο XML.

Τώρα που έχουμε δημιουργήσει τις απαραίτητες μεταβλητές, θα προχωρήσουμε στην επίτευξη της διαδικασίας στο αρχείο .m:

- (κενό) parserDidStartDocument: (NSXMLParser *) parser {
NSLog (@ "Το αρχείο βρέθηκε και άρχισε η ανάλυση");

}}

Αυτή η λειτουργία εκτελείται στην αρχή της διαδικασίας. Δεν υπάρχει λόγος να βάζετε τίποτα σε αυτήν τη λειτουργία, αλλά αν θέλετε να εκτελέσετε μια εργασία όταν αρχίζει να αναλύεται το αρχείο, τότε θα βάλετε τον κωδικό σας.

- (κενό) parseXMLFileAtURL: (NSString *) URL
{

NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U · Intel Mac OS X 10_5_6; el-us) AppleWebKit / 525.27.1 (KHTML, όπως Gecko) Έκδοση / 3.2.1 Safari / 525.27.1";
NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]].
[request setValue: agentString γιαHTTPHeaderField: @ "User-Agent"];
xmlFile = [NSURLConnection sendSynchronousRequest: αίτημα επιστροφήςResponse: μηδενικό σφάλμα: μηδέν];


άρθρα = [[NSMutableArray alloc] init]
errorParsing = ΟΧΙ.

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

// Ίσως χρειαστεί να ενεργοποιήσετε μερικά από αυτά ανάλογα με τον τύπο του αρχείου XML που αναλύετε
[rssParser setShouldProcessNamespaces: ΟΧΙ];
[rssParser setShouldReportNamespacePrefixes: ΟΧΙ];
[rssParser setShouldResolveExternalEntities: ΟΧΙ];

[rssParser parse];

}}

Αυτή η λειτουργία καθοδηγεί τη μηχανή να κατεβάσει ένα αρχείο σε μια συγκεκριμένη διεύθυνση ιστού (URL) και να ξεκινήσει τη διαδικασία για την ανάλυση του.

Λέμε στον απομακρυσμένο διακομιστή ότι είμαστε ένα Safari που εκτελείται σε Mac μόνο σε περίπτωση που ο διακομιστής προσπαθήσει να ανακατευθύνει το iPhone / iPad σε μια έκδοση για κινητά.

Οι επιλογές στο τέλος είναι συγκεκριμένες σε ορισμένα αρχεία XML. Τα περισσότερα αρχεία RSS και τα γενικά αρχεία XML δεν θα χρειαστούν να είναι ενεργοποιημένα.

- (κενό) parser: (NSXMLParser *) parserErrorOccurred: (NSError *) parseError {

NSString * errorString = [NSString stringWithFormat: @ "Κωδικός σφάλματος% i", [parseError code]];
NSLog (@ "Σφάλμα ανάλυσης XML:% @", errorString);


errorParsing = ΝΑΙ;
}}

Πρόκειται για μια απλή δρομολόγηση ελέγχου σφαλμάτων, η οποία θα θέσει μια δυαδική τιμή αν συναντήσει ένα σφάλμα. Μπορεί να χρειαστείτε κάτι πιο συγκεκριμένο εδώ, ανάλογα με το τι κάνετε. Εάν απλά πρέπει να εκτελέσετε κάποιο κώδικα μετά την επεξεργασία σε περίπτωση σφάλματος, τότε η δυαδική μεταβλητή errorParsing μπορεί να κληθεί εκείνη τη στιγμή.

(NSString *) namespaceURI qualifiedName: (NSString *) ΧαρακτηριστικάName: (NSDictionary *) attributeDict {NSString *
currentElement = [copyName];
ElementValue = [[NSMutableString alloc] init].
αν ([elementName είναιEqualToString: @ "στοιχείο"]) {
στοιχείο = [[NSMutableDictionary alloc] init].

}}

}}

Το κρέας του αναλυτή XML περιέχει τρεις λειτουργίες, ένα που τρέχει στην αρχή ενός μεμονωμένου στοιχείου, ένα που τρέχει κατά τη διάρκεια της ανάλυσης του στοιχείου και ένα που τρέχει στο τέλος του στοιχείου.

Για αυτό το παράδειγμα, θα αναλύσουμε ένα αρχείο παρόμοιο με τα αρχεία RSS που αναλύουν τα στοιχεία σε ομάδες κάτω από την επικεφαλίδα "αντικειμένων" μέσα στο αρχείο XML. Στην αρχή της επεξεργασίας, ελέγχουμε για το όνομα στοιχείου "στοιχείο" και την κατανομή του λεξικού στοιχείων μας, όταν ανιχνεύεται μια νέα ομάδα. Διαφορετικά, αρχικοποιούμε τη μεταβλητή μας για την τιμή.

- (κενό) parser: (NSXMLParser *) parser foundCharacters: (NSString *) συμβολοσειρά {
[ElementValue appendString: συμβολοσειρά];
}}

Αυτό είναι το εύκολο κομμάτι. Όταν βρίσκουμε χαρακτήρες, απλά προσθέτουμε τους στη μεταβλητή μας "ElementValue".

- (άκυρη) parser: (NSXMLParser *) αναλυτής didEndElement: (NSString *) όνομαName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName {
αν ([elementName είναιEqualToString: @ "στοιχείο"]) {
[articles addObject: [αντίγραφο είδους]];
} else {
[στοιχείο setObject: ElementValue forKey: elementName];
}}

}}

Όταν τελειώσουμε την επεξεργασία ενός στοιχείου, πρέπει να κάνουμε ένα από τα δύο πράγματα: (1) εάν το τελικό στοιχείο είναι "στοιχείο", έχουμε τελειώσει την ομάδα μας, οπότε θα προσθέσουμε το λεξικό μας στη σειρά "άρθρων" ".

Ή (2) εάν το στοιχείο δεν είναι "στοιχείο", θα ορίσουμε την τιμή στο λεξικό μας με ένα κλειδί που ταιριάζει με το όνομα του στοιχείου. (Αυτό σημαίνει ότι δεν χρειαζόμαστε μια μεμονωμένη μεταβλητή για κάθε πεδίο μέσα στο αρχείο XML. Μπορούμε να τα επεξεργαστούμε λίγο πιο δυναμικά.)

- (κενό) parserDidEndDocument: (NSXMLParser *) parser {

αν (errorParsing == ΟΧΙ)
{
NSLog (@ "Η επεξεργασία XML έγινε!");
} else {
NSLog (@ "Σφάλμα κατά την επεξεργασία XML)";
}}

}}

Αυτή είναι η τελευταία λειτουργία που απαιτείται για την ρουτίνα ανάλυσης. Απλώς τελειώνει το έγγραφο. Θα τοποθετήσετε οποιοδήποτε κωδικό θέλετε να ολοκληρώσετε τη διαδικασία εδώ ή οτιδήποτε άλλο μπορεί να θέλετε να κάνετε σε περίπτωση σφάλματος.

Ένα πράγμα που πολλές εφαρμογές μπορεί να θέλετε να κάνετε εδώ είναι να αποθηκεύσετε τα δεδομένα ή / και το αρχείο XML σε ένα αρχείο στη συσκευή. Με αυτόν τον τρόπο, εάν ο χρήστης δεν είναι συνδεδεμένος στο Internet την επόμενη φορά που φορτώνει την εφαρμογή, μπορεί ακόμα να πάρει αυτές τις πληροφορίες.

Φυσικά, δεν μπορούμε να ξεχάσουμε το πιο σημαντικό κομμάτι: λέγοντας την αίτησή σας για να αναλύσετε το αρχείο (και δίνοντάς του μια διεύθυνση στο web για να το βρει!).

Για να ξεκινήσετε τη διαδικασία, απλά πρέπει να προσθέσετε αυτήν τη γραμμή κώδικα στο κατάλληλο σημείο όπου θέλετε να κάνετε την επεξεργασία XML:

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