我正在创建一个应该从URL解析XML文件的应用程序。
目前,我只是想了解事情的基本知识。我知道你可能看起来非常简单,但作为一个新手,有些事情仍然很难理解,但我已经做了一些简单的应用程序。
虽然我查了一下NSXMLParserDelegate协议,但我不知道如何使用这些例子......
我想从此网址解析:
我也在同一主题上看过其他问题,但我无法弄清楚这些解决方案,而且它们并不完全是我想要的。因此,我问一个具体的问题。
答案 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工作。