Jak analizować pliki XML w Xcode

click fraud protection

Chociaż wbudowany XML parser dodaje prawdziwą wartość do nowej aplikacji komputerowej lub mobilnej, kodowanie tej funkcjonalności zwykle wymaga dużo czasu na rozwój i testów beta. Program Xcode firmy Apple zawiera parser XML, który omija większość tej ręcznej pracy.

Na XML plik może zawierać wszystko, od podstawowych danych o Twojej aplikacji do kanał RSS dla strony internetowej. Mogą również być świetnym sposobem na zdalne aktualizowanie informacji w Twojej aplikacji, omijając w ten sposób potrzebę przesyłania nowego pliku binarnego do Apple, aby po prostu dodać nowy element do listy.

Proces Xcode

Wbudowany proces Xcode zawiera kroki do inicjalizacji zmiennych, które mają być używane, uruchomienie procesu parsera XML, zasilenie tego procesu do pliku, ocena poszczególnych elementów i znaków (wartości) w tych elementach, rozpoznawanie końca pojedynczego elementu i zakończenie parsowania proces.

Użyj parsera XML

Aby zilustrować szczegóły, przeanalizujemy przykładowy plik z internetu, przekazując mu konkretny adres internetowy (URL).

instagram viewer

Zacznij od zbudowania pliku nagłówkowego. To jest przykład bardzo podstawowego pliku nagłówkowego dla kontrolera widoku szczegółów z minimalnymi wymaganiami dotyczącymi parsowania naszego pliku:

@interface RootViewController: UITableViewController {
DetailViewController *detailViewController;
NSXMLParser *rssParser;
NSMutableArray *artykuły;
NSMutableDictionary *item;
NSString *bieżącyElement;
NSMutableString *ElementValue;
Błąd BOOLParsing;
}
@property (nieatomowe, zachowaj) IBOutlet DetailViewController *detailViewController;
- (nieważny) parseXMLFileAtURL:(NSString *)URL;


Funkcja parseXMLFileAtURL uruchamia proces. Po zakończeniu „artykuły” NSMutableArray zawierają dane. Tablica składa się ze słowników mutowalnych z kluczami powiązanymi z nazwami pól w pliku XML.

Następnie zainicjuj proces:

- (nieważny) parserDidStartDocument:(NSXMLParser *)parser{
NSLog(@"Znaleziono plik i rozpoczęto analizowanie");
}

Ta funkcja działa na początku procesu. Nie ma potrzeby umieszczania czegokolwiek w tej funkcji, ale jeśli chcesz wykonać zadanie, gdy plik zaczyna być parsowany, to jest to miejsce, w którym umieścisz swój kod.

Poleć programowi, aby coś pobrał

Następnie poinstruuj program, aby coś pobrał:

- (nieważny) parseXMLFileAtURL:(NSString *)URL
{
NSString *agentString = @"Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; pl) AppleWebKit/525.27.1 (KHTML, jak Gecko) Wersja/3.2.1 Safari/525.27.1";
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:
[NSURL URLWithString: URL]];
[żądanie setValue: agentString forHTTPHeaderField:@"User-Agent"];
xmlFile = [ NSURLConnection sendSynchronousRequest: żądanie zwracające odpowiedź: nil błąd: nil ];
artykuły = [[NSMutableArray alloc] init];
errorParsing=NIE;
rssParser = [[NSXMLParser alloc] initWithData: xmlFile];
[rssParser setDelegate: self];
// Być może będziesz musiał włączyć niektóre z nich w zależności od typu analizowanego pliku XML
[rssParser setShouldProcessNamespaces: NIE];
[rssParser setShouldReportNamespacePrefixy: NO];
[rssParser setShouldResolveExternalEntities: NIE];
[rssParser analizuje];
}


Ta funkcja nakazuje silnikowi pobranie pliku z określonego adresu internetowego (URL) i rozpoczęcie procesu jego analizy. Mówimy serwerowi zdalnemu, że jesteśmy Safari działającym na Macu, na wypadek, gdyby serwer próbował przekierować iPhone'a / iPada do wersji mobilnej.

Opcje na końcu są specyficzne dla niektórych plików XML. Większość plików RSS i ogólnych plików XML nie wymaga ich włączenia.

Błąd — sprawdź wynik

Wykonaj podstawowe sprawdzanie błędów w wyniku:

- (nieważny) parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError {
NSString *errorString = [NSString stringWithFormat:@"Kod błędu %i", [kod błędu analizy]];
NSLog(@"Błąd parsowania XML: %@", errorString);
errorParsing=TAK;
} Ten routing sprawdzający błędy ustawia wartość binarną, jeśli napotka błąd. Możesz potrzebować tutaj czegoś bardziej konkretnego, w zależności od tego, co robisz. Jeśli potrzebujesz po prostu uruchomić jakiś kod po przetworzeniu w przypadku błędu,


Ta procedura sprawdzania błędów ustawia wartość binarną, jeśli napotka błąd. Możesz potrzebować tutaj czegoś bardziej konkretnego, w zależności od tego, co robisz. Jeśli po prostu potrzebujesz uruchomić jakiś kod po przetworzeniu w przypadku błędu, w tym czasie można wywołać zmienną binarną parsowania błędu.

Przeanalizuj pobraną zawartość

Następnie program rozbija pobrane treści i analizuje je:

- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURIqualifiedName:(NSString *)qName atrybuty:(NSDictionary *)attributeDict{
bieżącyElement = [kopia NazwaElementu];
ElementValue = [[NSMutableString alloc] init];
if ([elementName isEqualToString:@"item"]) {
item = [[NSMutableDictionary alloc] init];
}
}


Mięso parsera XML zawiera trzy funkcje, z których jedna działa na początku jednostki element, który działa w trakcie parsowania elementu i taki, który działa na końcu element.

W tym przykładzie przeanalizujemy plik podobny do plików RSS, które dzielą elementy na grupy pod nagłówkiem przedmiotów w pliku XML. Na początku przetwarzania sprawdzamy nazwę elementu „item” i przydzielamy nasz słownik pozycji po wykryciu nowej grupy. W przeciwnym razie inicjujemy naszą zmienną dla wartości:

- (unieważniony) parser:(NSXMLParser *)znaleziono parserCharacters:(NSString *)string{
[ElementValue appendString: ciąg];
}


Gdy znajdziemy znaki, po prostu dodajemy je do naszej zmiennej Wartość elementu:

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURIqualifiedName:(NSString *)qName{
if ([elementName isEqualToString:@"item"]) {
[artykuły addObject:[kopia elementu]];
} jeszcze {
[element setObject: ElementValue forKey: elementName];
}
}

Co się dzieje po zakończeniu analizowania

Kiedy program zakończy przetwarzanie elementu, musi wykonać jedną z dwóch rzeczy:

  • Jeśli końcowym elementem jest pozycja, zakończyliśmy naszą grupę, więc dodamy nasz słownik do naszej tablicy artykułów.
  • Jeśli element nie jest pozycja, ustawimy wartość w naszym słowniku za pomocą klucza pasującego do nazwy elementu. (Oznacza to, że nie potrzebujemy osobnej zmiennej dla każdego pola w pliku XML. Możemy je przetwarzać nieco bardziej dynamicznie.)

Jest to ostatnia funkcja potrzebna do naszej procedury parsowania; kończy dokument. Umieść tutaj dowolny kod końcowy lub określ podprogram korekcji błędów:

- (nieważny) parserDidEndDocument:(NSXMLParser *)parser {
if (errorParsing == NIE)
{
NSLog(@"Zakończono przetwarzanie XML!");
} jeszcze {
NSLog(@"Wystąpił błąd podczas przetwarzania XML");
}
}

Zapisz dane

Jedną z rzeczy, które wiele aplikacji może chcieć tutaj zrobić, jest zapisanie danych lub pliku XML w pliku na urządzeniu. W ten sposób, jeśli urządzenie nie będzie połączone z Internetem przy następnym załadowaniu aplikacji, nadal będzie mogło uzyskać dostęp do tych informacji.

Oczywiście nie możemy zapomnieć o najważniejszej części: poproszeniu aplikacji o przeanalizowanie pliku (i podanie jej adresu internetowego, pod którym można go znaleźć!). Aby rozpocząć proces, dodaj ten wiersz kodu do odpowiedniego miejsca, w którym chcesz wykonać przetwarzanie XML:

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