struct RSSItem {
var imageURL: String
var title: String
var auther: String
var pubDate: String
var description: String
}
class FeedParser: NSObject, XMLParserDelegate {
private var rssItems: [RSSItem] = []
private var currentElement = ""
private var fetchParam = [String : String]()
private var currentImage: String = "" {
didSet {
currentImage = currentImage.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
}
}
private var currentTitle: String = "" {
didSet {
currentTitle = currentTitle.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
}
}
private var currentAuther: String = ""{
didSet {
currentAuther = currentAuther.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
}
}
private var currentPubDate: String = ""{
didSet {
currentPubDate = currentPubDate.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
}
}
private var currentDescription: String = "" {
didSet {
currentDescription = currentDescription.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)
}
}
private var parserCompletionHandler: (([RSSItem]) -> Void)?
func parseFeed(url: String, comletionHandler: (([RSSItem]) -> Void)?) {
self.parserCompletionHandler = comletionHandler
let request = URLRequest(url: URL(string: url)!)
let urlSession = URLSession.shared
let task = urlSession.dataTask(with: request) { (data, response, error) in
guard let data = data else {
if let error = error {
print(error.localizedDescription)
}
return
}
// parse data
let parser = XMLParser(data: data)
parser.delegate = self
parser.parse()
}
task.resume()
}
// MARK: - Parser deledate
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
currentElement = elementName
if currentElement == "item" {
currentImage = ""
currentAuther = ""
currentPubDate = ""
currentTitle = ""
currentDescription = ""
}
}
func parser(_ parser: XMLParser, foundCharacters string: String) {
switch currentElement {
case "atom:name": currentAuther += string
case "pubDate": currentPubDate += string
case "title": currentTitle += string
case "description": currentDescription += string
default: break
}
}
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
if elementName == "item" {
let rssItem = RSSItem(imageURL: currentImage, title: currentTitle, auther: currentAuther, pubDate: currentPubDate, description: currentDescription)
self.rssItems.append(rssItem)
}
print(currentDescription)
}
func parserDidEndDocument(_ parser: XMLParser) {
parserCompletionHandler?(rssItems)
}
func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) {
print(parseError.localizedDescription)
}