Skip to main content

Jak parsować pliki XML w Xcode

Odczyt tajnych plików podczas parsowania XML w Java - o XXE (Może 2025)

Odczyt tajnych plików podczas parsowania XML w Java - o XXE (Może 2025)
Anonim

Jednym z prostych zadań, który jest szkieletem wielu aplikacji, jest możliwość analizowania plików XML. I na szczęście Xcode sprawia, że ​​stosunkowo łatwo można sparsować plik XML w Objective-C.

Plik XML może zawierać dowolne dane - od podstawowych danych o aplikacji do kanału RSS witryny. Mogą też być świetnym sposobem na zdalne aktualizowanie informacji w aplikacji, pomijając potrzebę przesłania nowego pliku binarnego do Apple po prostu w celu dodania nowego elementu do listy.

Jak zatem przetwarzać pliki XML w Xcode? Proces zawiera kroki inicjalizacji zmiennych, które mają być użyte, uruchomienie procesu analizatora składni XML, przesłanie tego procesu do pliku, rozpoczęcie pojedynczego elementu, znaków (wartość) w elemencie, koniec pojedynczego elementu i koniec procesu parsowania.

W tym przykładzie będziemy analizować plik z Internetu, przekazując mu konkretny adres internetowy (URL).

Zaczniemy od zbudowania pliku nagłówkowego. Jest to przykład bardzo podstawowego pliku nagłówkowego dla kontrolera widoku szczegółowego z minimalnymi wymaganiami do analizowania naszego pliku:

@interface RootViewController: UITableViewController {DetailViewController * detailViewController;NSXMLParser * rssParser;NSMutableArray * artykuły;NSMutableDictionary * item;NSString * currentElement;NSMutableString * ElementValue;BOOL errorParsing;}@property (nonatomic, retain) IBOutlet DetailViewController * detailViewController;- (void) parseXMLFileAtURL: (NSString *) URL;Funkcja parseXMLFileAtURL uruchomi dla nas proces. Po zakończeniu, "artykuły" NSMutableArray będą przechowywać nasze dane. Tablica będzie składać się z edytowalnych słowników z kluczami związanymi z nazwami pól w pliku XML.

Teraz, gdy ustawimy potrzebne zmienne, przejdziemy do spotkania procesu w pliku .m:

- (void) parserDidStartDocument: (NSXMLParser *) parser {NSLog (@ "Znaleziony plik i rozpoczęte przetwarzanie");}

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

- (void) parseXMLFileAtURL: (NSString *) URL{NSString * agentString = @ "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-us) AppleWebKit / 525.27.1 (KHTML, jak Gecko) Wersja / 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: zero błąd: nil;articles = init NSMutableArray alloc init;errorParsing = NO;rssParser = NSXMLParser alloc initWithData: xmlFile;rssParser setDelegate: self;// Może być konieczne włączenie niektórych z nich w zależności od typu pliku XML, który analizujeszrssParser setShouldProcessNamespaces: NO;rssParser setShouldReportNamespacePrefixes: NO;rssParser setShouldResolveExternalEntities: NO;rssParser parsować;}

Ta funkcja nakazuje silnikowi pobranie pliku pod konkretny adres internetowy (URL) i rozpoczęcie procesu jego analizowania. Mówimy serwerowi zdalnemu, że jesteśmy Safari działającą 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 będzie ich potrzebować.

- (void) parser: (NSXMLParser *) parser parseErrorOccurred: (NSError *) parseError {NSString * errorString = NSString stringWithFormat: @ "Kod błędu% i", kod parsera;NSLog (@ "Błąd parsowania XML:% @", errorString);errorParsing = YES;}Jest to prosta metoda sprawdzania błędów, która ustawi wartość binarną, jeśli napotka błąd. W zależności od tego, co robisz, możesz potrzebować czegoś bardziej konkretnego. Jeśli po wystąpieniu błędu trzeba po prostu uruchomić kod po przetworzeniu, można wywołać w tym momencie zmienną binarną errorParsing.

- (void) parser: (NSXMLParser *) parser didStartElement: (NSString *) elementName namespaceURI: (NSString *) namespaceURI qualifiedName: (NSString *) qName attributes: (NSDictionary *) attributeDict {currentElement = elementName copy;ElementValue = NSMutableString alloc init;if (elementName isEqualToString: @ "item") {item = init NSMutableDictionary init;}} Mięso parsera XML zawiera trzy funkcje, jedną działającą na początku pojedynczego elementu, taką, która działa podczas środka parsowania elementu, i taką, która działa na końcu elementu.

W tym przykładzie będziemy analizować plik podobny do plików RSS, które rozkładają elementy na grupy pod nagłówkiem "items" w pliku XML. Na początku przetwarzania sprawdzamy nazwę elementu "element" i przydzielając nasz słownik przedmiotów po wykryciu nowej grupy. W przeciwnym razie zainicjujemy naszą zmienną dla wartości.

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

To jest łatwa część. Kiedy znajdziemy postacie, po prostu dodajemy je do naszej zmiennej "ElementValue".

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

Po zakończeniu przetwarzania elementu musimy wykonać jedną z dwóch rzeczy: (1) jeśli elementem końcowym jest "element", to zakończyliśmy naszą grupę, więc dodamy nasz słownik do naszej tablicy "artykułów" ". Lub (2) jeśli element nie jest "item", ustawimy wartość w naszym słowniku za pomocą klucza pasującego do nazwy elementu. (Oznacza to, że nie potrzebujemy indywidualnej zmiennej dla każdego pola w pliku XML. Możemy przetwarzać je nieco bardziej dynamicznie.)

- (void) parserDidEndDocument: (NSXMLParser *) parser {if (errorParsing == NO){NSLog (@ "Przetwarzanie XML zrobione!");} else {NSLog (@ "Wystąpił błąd podczas przetwarzania XML");}}

Jest to ostatnia funkcja potrzebna do naszego parsowania. Po prostu kończy dokument. W tym miejscu wstawisz kod, który chcesz dokończyć, lub wszystko, co możesz zrobić w razie błędu.

Jedną rzeczą, którą może chcieć wiele aplikacji, jest zapisanie danych i / lub pliku XML w pliku na urządzeniu. W ten sposób, jeśli użytkownik nie połączy się z Internetem przy następnym ładowaniu aplikacji, nadal będzie mógł uzyskać te informacje.

Oczywiście nie możemy zapomnieć o najważniejszej części: nakazanie twojemu aplikacjowi przeanalizowania pliku (i podanie adresu internetowego, aby go znaleźć!).

Aby rozpocząć proces, wystarczy dodać ten wiersz kodu do odpowiedniego miejsca, w którym chcesz wykonać przetwarzanie XML:

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