【问题标题】:Parsing from URL with NSXMLParser使用 NSXMLParser 从 URL 解析
【发布时间】:2016-01-06 01:32:07
【问题描述】:

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

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

虽然我查过 NSXMLParserDelegate 协议,但我不知道如何使用那些例子...

我想从这个 URL 解析:

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

我还查看了同一主题的其他问题,但我无法弄清楚这些解决方案,它们并不是我想要的。因此,我要问一个具体的问题。

【问题讨论】:

  • 只是对您的 xml 的注释,第 448-471 和 477-482 行尝试重新定义无效 xml 的属性,因为您不能在同一个标​​签上有两个同名的属性(@987654322在这种情况下,TimeTableSchedule 中的 @ 属性)。

标签: ios xml swift nsxmlparser


【解决方案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
}

附:您还可以通过解析 xml 来动态创建视图。即,如果检测到“按钮”标签(如上面的“名称”),则可以创建 UIButton(可以在 xml 中提供框架和按钮标题)。对于 UILabel、textField 也是如此。

【讨论】:

  • 我认为他想要一个 Swift 的答案。
  • 对不起。我仍然希望它对某些人有所帮助。和平!!
【解决方案2】:

将委托添加到您的视图控制器:

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 工作。

【讨论】:

  • 我无法将服务器切换为使用 https。你能想到我如何访问 xml 文件的任何其他方式吗?使用 url 很方便。
  • 然后就行了——让 xmlParser = NSXMLParser(contentsOfURL: url!)!它说“实例成员“url”不能用于类型“ViewController”的错误,另一个错误在线说 - \n xmlParser.delegate = self“预期声明”我该怎么办?
  • 好吧,如果 xml 不太可能更改,您可以随时将其存储在手机上。
  • 我应该改用 AEXML 解析器吗?用于读取本地 xml 文件?
  • 您仍然可以使用 NSXMLParser,只需使用 fileURLWithPath 制作 NSURL:
猜你喜欢
  • 1970-01-01
  • 2011-09-09
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多