使用NSXMLParser从URL解析

时间:2015-10-08 12:18:38

标签: ios xml swift nsxmlparser

我正在创建一个应该从URL解析XML文件的应用程序。

目前,我只是想了解事情的基本知识。我知道你可能看起来非常简单,但作为一个新手,有些事情仍然很难理解,但我已经做了一些简单的应用程序。

虽然我查了一下NSXMLParserDelegate协议,但我不知道如何使用这些例子......

我想从此网址解析:

  

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

我也在同一主题上看过其他问题,但我无法弄清楚这些解决方案,而且它们并不完全是我想要的。因此,我问一个具体的问题。

2 个答案:

答案 0 :(得分: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动态创建视图。即,如果检测到“button”标签(如上面的“Name”),则可以创建UIButton(可以在xml中提供帧和按钮标题)。同样对于UILabel,textField。

答案 1 :(得分:0)

将代理添加到视图控制器:

class ViewController: UIViewController, NSXMLParserDelegate {

然后用xml解析一个url:

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是通过http而不是https访问的,所以您可能会遇到错误。我建议您将服务器切换为使用https,但要快速测试you can add something to your info.plist以便现在通过http工作。