2015-10-08 2 views
1

Я делаю приложение, которое должно анализировать XML-файл из URL.Анализ из URL с NSXMLParser

На данный момент я просто хочу знать основы, как все работает. Я знаю, что это может показаться вам очень простым, но, будучи новичком в нем, некоторые вещи по-прежнему трудно понять, но я уже сделал несколько простых приложений.

Хотя я посмотрел NSXMLParserDelegate протокол, я не знаю, как использовать эти примеры ...

Я хочу парсер из этого URL:

http://jpg.tartu.ee/tunniplaan/xml/periood1.xml

I также смотрели другие вопросы по той же теме, но я не могу понять эти решения, и они не совсем то, что я ищу. Поэтому я задаю конкретный вопрос.

+0

Только примечание о ваших xml, строках 448-471 и 477-482 пытается переопределить атрибут, который является недопустимым xml, поскольку у вас не может быть двух атрибутов с тем же именем в одном и том же теге (атрибут 'Period' в' TimeTableSchedule' в этом случае). –

ответ

1

Примечание: Указанная вами ссылка не работает. Рассмотрим простой пример.

<Class> 
    <Student> 
    <Name>John Snow</Name> 
    </Student> 
    <Student> 
    <Name>Harvey Specter</Name> 
    </Student> 
</Class> 


- (void)viewDidLoad{ 
     NSURL *url = [[NSURL alloc]initWithString:@"yourURL"]; 
     NSXMLParser *parser = [[NSXMLParser alloc]initWithContentsOfURL:url]; 
     [parser setDelegate:self]; 
     BOOL result = [parser parse]; 
} 

// Following methods are the NSXMLParser delegate methods : 

- (void)parserDidStartDocument:(NSXMLParser *)parser{ 

    //Document Starts... 

} 

- (void)parserDidEndDocument:(NSXMLParser *)parser{ 

    //Document Ends... 

} 
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict 
{ 

    //This method detects a tag(eg. <Name>) 

    NSLog(@\"Did start element\"); 
    if ([elementName isEqualToString:@"Name"]){ 
    NSLog(@"name tag"); 
    // set current tag as "Name" tag 
    return; 
    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    // if current tag is Name 

    if([currentTag isEqualToString:@"Name"]){ 
     //Take text, JohnSnow or HarveySpecter 
     NSString *text = string; 
    } 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    // Detects end of tag.(eg. </Name>) 

    NSLog(@"Did end element"); 
    if ([elementName isEqualToString:@"Name"]){ 
      NSLog(@"Name end"); 
      // Do what's necessary.. 
     } 
    // set current tag as nil 
} 

P.S. Вы также можете создавать представление динамически, анализируя xml. то есть, если обнаружен тег «кнопка» (например, «Имя» выше), тогда может быть создан UIButton (заголовок кадра и кнопки может быть предоставлен в xml.). Аналогично для UILabel, textField.

+0

Я думаю, он хотел получить ответ Свифт. –

+0

Извините. Тем не менее, я надеюсь, что это поможет некоторым людям. Мир! –

0

Добавьте делегат к контроллеру вида:

class ViewController: UIViewController, NSXMLParserDelegate { 

Тогда для разбора URL с XML:

let url = NSURL(string: "http://jpg.tartu.ee/tunniplaan/xml/periood1.xml") 
let xmlParser = NSXMLParser(contentsOfURL: url!)! 
xmlParser.delegate = self 
xmlParser.parse() 

добавить также функции делегата для разбора (я добавил пример того, как чтобы напечатать имя элемента на консоли.

func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) { 
    print("Element's name is \(elementName)") 
} 

Обратите внимание, что поскольку ваш xml доступен через htt p, а не https, вы можете столкнуться с ошибками. Сначала я предлагаю вам переключить сервер на использование https, но для быстрого тестирования you can add something to your info.plist, чтобы заставить его работать через http на данный момент.

+0

Я не могу переключить сервер на использование https. Не могли бы вы подумать о другом способе доступа к XML-файлу? с url это просто удобно. –

+0

И на линии - let xmlParser = NSXMLParser (содержимоеOfURL: url!)! Это говорит об ошибке, что «экземпляр член„URL“не может быть использован по типу„ViewController“» И еще одна ошибка говорит о линии - \ п xmlParser.delegate = Я «Ожидаемая декларация» Что я должен делать? –

+0

Ну, вы всегда можете хранить xml на телефоне, если он вряд ли изменится. –