我正在制作一个应用程序,应该从URL解析XML文件。
现在,我只想知道基本的东西是如何工作的。我知道你可能看起来很简单,但作为一个新手,有些东西仍然很难理解,但我已经做了一些简单的应用程序。
虽然我已经看了NSXMLParserDelegate协议,我不知道如何使用这些例子…
我想从这个URL解析:
http://jpg.tartu.ee/tunniplaan/xml/periood1.xml
我也看了其他问题在同一主题,但我不能找出这些解决方案,他们不是我正在寻找的。因此,我问了一个具体的问题。
注意:您提供的链接不起作用。考虑一个简单的例子:
<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动态创建视图。也就是说,如果检测到"button"标签(如上面的"Name"),则可以创建一个UIButton(框架和按钮标题可以在xml中提供)。类似UILabel, textField.
将委托添加到视图控制器:
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,但为了快速测试,您可以在info.plist
中添加一些东西,使其通过http工作。