首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从rest中解析xml数据

从rest中解析xml数据
EN

Stack Overflow用户
提问于 2016-06-28 07:39:31
回答 1查看 1.2K关注 0票数 0

我试图从rest中解析xml数据,数据被解析并存储在名为NewslettersParser的数组文章中,但我无法将其存储在另一个名为MyTableViewController的类中,下面是我的代码:

NewslettersParser.swift:

代码语言:javascript
复制
import Foundation

private var url = NSURL(string: "http://www.iaa.edu.jo/load/iaa/newsletters")

class NewslettersParser: NSObject, NSXMLParserDelegate{

var parser : NSXMLParser! = NSXMLParser(contentsOfURL: url!)
var currentElement:String = ""
var passData:Bool=false
var passName:Bool=false
var postFile:String = ""
var postDate:String = ""
var posts: [Newsletters] = []
var counter: Int = 0
var pageNumber: Int = 1
var news: Newsletters = Newsletters()
let defaults = NSUserDefaults.standardUserDefaults()



func getData() {
    let postEndpoint: String = "http://www.iaa.edu.jo/load/iaa/newsletters"
    let url = NSURL(string: postEndpoint)!
    let request = NSMutableURLRequest(URL: url)
    let session = NSURLSession.sharedSession()
    request.HTTPMethod = "POST"
    let paramString = "page=\(pageNumber)"
    request.HTTPBody = paramString.dataUsingEncoding(NSUTF8StringEncoding)

    session.dataTaskWithRequest(request, completionHandler: { ( data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in
        guard let realResponse = response as? NSHTTPURLResponse where
            realResponse.statusCode == 200 else {
                print("Not a 200 response")
                return
        }
        let newStr = String(data: data!, encoding: NSUTF8StringEncoding)
        print(newStr)

        self.parser = NSXMLParser(data: data!)
        self.parser.delegate = self
        self.parser.parse()

        let success:Bool = self.parser.parse()

        if success {
            print("parse success!")

        } else {
            //error
        }


    }).resume()


}

func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
    currentElement=elementName
    if(elementName=="item" || elementName=="date" || elementName=="file"){
        if(elementName=="item"){
            passName=true
        }
        passData=true
    }
}

func parser(parser: NSXMLParser, foundCharacters string: String) {
    if(passData){

         if currentElement=="date"{
            postDate = string
        }
        else if currentElement=="file"{
            postFile = string
        }
    }
}

// func parserDidEndDocument(parser: NSXMLParser){
//    news.fetch(posts)
//}

func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
    currentElement=""
    let post: Newsletters = Newsletters()

    if(elementName=="item" || elementName=="date" || elementName=="file"){

        if(elementName=="item"){
            passName=false
            post.date = postDate
            post.file = postFile
            posts.append(post)
            counter += 1
            if(counter == 10){
                pageNumber += 1
                counter = 0
                self.getData()
            }
        }
    }
    if(posts.count == 23){
        news.data = posts
    }
    //self.myTable.reloadData()
}


func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) {
    NSLog("failure error: %@", parseError)
}


}

下面是MyTableViewController:

代码语言:javascript
复制
import UIKit
import SDWebImage

class MyTableTableViewController: UITableViewController {

@IBOutlet var myTable: UITableView!


var newsletters: [Newsletters] = []
var news: Newsletters = Newsletters()

let Nparse: NewslettersParser = NewslettersParser()

override func viewDidLoad() {
    super.viewDidLoad()
    //
    Nparse.getData()
    newsletters = news.data
    self.myTable.reloadData()

}

和Newsletters.swift:

代码语言:javascript
复制
class Newsletters{
var file: String = String()
var date: String = String()
var data: [Newsletters] = []
let Nparse: NewslettersParser = NewslettersParser()
 }

提前谢谢你。

EN

回答 1

Stack Overflow用户

发布于 2018-06-11 10:50:14

在这种情况下,委托模式非常适合。在完成对控制器的解析时,可以使用委托方法。

代表协议

代码语言:javascript
复制
protocol NewslettersParserDelegate: class {
    func finishedParsing()
}

**你的NewslettersParser.swift有授权能力**

代码语言:javascript
复制
    import Foundation

    private var url = NSURL(string: "http://www.iaa.edu.jo/load/iaa/newsletters")

    class NewslettersParser: NSObject, NSXMLParserDelegate{

    var parser : NSXMLParser! = NSXMLParser(contentsOfURL: url!)
    var currentElement:String = ""
    var passData:Bool=false
    var passName:Bool=false
    var postFile:String = ""
    var postDate:String = ""
    var posts: [Newsletters] = []
    var counter: Int = 0
    var pageNumber: Int = 1
    var news: Newsletters = Newsletters()
    let defaults = NSUserDefaults.standardUserDefaults()

// delegate property 
weak var newslettersParserDelegate: NewslettersParserDelegate!



    func getData() {
        let postEndpoint: String = "http://www.iaa.edu.jo/load/iaa/newsletters"
        let url = NSURL(string: postEndpoint)!
        let request = NSMutableURLRequest(URL: url)
        let session = NSURLSession.sharedSession()
        request.HTTPMethod = "POST"
        let paramString = "page=\(pageNumber)"
        request.HTTPBody = paramString.dataUsingEncoding(NSUTF8StringEncoding)

        session.dataTaskWithRequest(request, completionHandler: { ( data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in
            guard let realResponse = response as? NSHTTPURLResponse where
                realResponse.statusCode == 200 else {
                    print("Not a 200 response")
                    return
            }
            let newStr = String(data: data!, encoding: NSUTF8StringEncoding)
            print(newStr)

            self.parser = NSXMLParser(data: data!)
            self.parser.delegate = self
            self.parser.parse()

            let success:Bool = self.parser.parse()

            if success {
                print("parse success!")

            } else {
                //error
            }


        }).resume()


    }

    func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {
        currentElement=elementName
        if(elementName=="item" || elementName=="date" || elementName=="file"){
            if(elementName=="item"){
                passName=true
            }
            passData=true
        }
    }

    func parser(parser: NSXMLParser, foundCharacters string: String) {
        if(passData){

             if currentElement=="date"{
                postDate = string
            }
            else if currentElement=="file"{
                postFile = string
            }
        }
    }

    // func parserDidEndDocument(parser: NSXMLParser){
    //    news.fetch(posts)
    //}

    func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
        currentElement=""
        let post: Newsletters = Newsletters()

        if(elementName=="item" || elementName=="date" || elementName=="file"){

            if(elementName=="item"){
                passName=false
                post.date = postDate
                post.file = postFile
                posts.append(post)
                counter += 1
                if(counter == 10){
                    pageNumber += 1
                    counter = 0
                    self.getData()
                }
            }
        }
        if(posts.count == 23){
            news.data = posts
        }
        //self.myTable.reloadData() instead of this you can now call 
        newslettersParserDelegate.finishedParsing()
    }


    func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) {
        NSLog("failure error: %@", parseError)
    }


    }

现在,在您的MyTableViewController中,您可以确认委托和使用该方法

代码语言:javascript
复制
import UIKit
import SDWebImage

class MyTableTableViewController: UITableViewController, NewslettersParserDelegate {

@IBOutlet var myTable: UITableView!

var newsletters: [Newsletters] = []
var news: Newsletters = Newsletters()

let Nparse: NewslettersParser = NewslettersParser()

override func viewDidLoad() {
    super.viewDidLoad()
    //
    Nparse.getData()
    Nparse.newslettersParserDelegate = self

    newsletters = news.data
    self.myTable.reloadData()

}

func finishedParsing(){
// reload data upon finishing parsing 
}


}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38069980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档