2015-11-29 55 views
0

我需要幫助解析來自URL的XML。我已經閱讀了很多內容,但無法弄清楚如何獲得此內容。我發現的所有示例都與示例以及如何從分析的XML數據中獲取信息有點不明確。Swift 2中的XML解析(Xcode 7)

我將如何解析這個XML

<menu> 
    <menuitems> 
     <item price="$10">Pizza</item> 
     <item price="$5">Salad</item> 
     <item price="$3">Bread</item> 
    </menuitems> 
</menu> 

這是我要離的教程,但我不明白爲什麼這個教程是在陣列和字典訪問數據。

http://www.theappguruz.com/blog/xml-parsing-using-nsxmlparse-swift

在Xcode中7(斯威夫特2),我將如何解析和訪問這些信息。我知道這不是如何訪問,但我正在尋找像下面的代碼。

print ("\(item[0].data)") // Pizza // 
print ("\(item[0].price)") // $10 // 

這是來自教程的代碼,但我無法弄清楚如何訪問從URL解析的所有數據。我將如何編輯此代碼以適合我的結構?

import UIKit 
import Foundation 

class ViewController: UIViewController, NSXMLParserDelegate 

    { 

    var parser = NSXMLParser() 
    var posts = NSMutableArray() 
    var elements = NSMutableDictionary() 
    var element = NSString() 
    var title1 = NSMutableString() 
    var date = NSMutableString() 

func beginParsing() 
{ 
    posts = [] 
    parser = NSXMLParser(contentsOfURL:(NSURL(string:"http://images.apple.com/main/rss/hotnews/hotnews.rss"))!)! 
    parser.delegate = self 
    parser.parse() 
} 



func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) 
{ 
    element = elementName 
    if (elementName as NSString).isEqualToString("item") 
    { 
     elements = NSMutableDictionary() 
     elements = [:] 
     title1 = NSMutableString() 
     title1 = "" 
     date = NSMutableString() 
     date = "" 
    } 
} 

func parser(parser: NSXMLParser, foundCharacters string: String) 
{ 
    if element.isEqualToString("title") { 
     title1.appendString(string) 
    } else if element.isEqualToString("pubDate") { 
     date.appendString(string) 
    } 
} 


func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) 
{ 
    if (elementName as NSString).isEqualToString("item") { 
     if !title1.isEqual(nil) { 
      elements.setObject(title1, forKey: "title") 
     } 
     if !date.isEqual(nil) { 
      elements.setObject(date, forKey: "date") 
     } 
     posts.addObject(elements) 

    } 

    } 

} 
+0

您可以嘗試將XML解析爲NSDictionary的[XMLDictionary](https://github.com/nicklockwood/XMLDictionary)。 –

+0

你什麼時候調用beginParsing()方法?在viewDidLoad()中?或者它是一個委託方法? – IamMashed

回答

4

它看起來像解析器代碼是從別的東西借來的。如果這真的是你的XML,認爲它比這更簡單。在你的情況唯一的技巧是price不是一個元素,而只是item元素的attributeDict。我可能會創建自己的自定義類型,Item來捕獲項目的名稱和價格。

無論如何,你可能最終的東西,如:

struct Item { 
    let name: String 
    let price: String 
} 

var itemName: String? 
var itemPrice: String? 
var items: [Item]! 

func parserDidStartDocument(parser: NSXMLParser) { 
    items = [] 
} 

func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) { 
    if elementName == "item" { 
     itemPrice = attributeDict["price"] 
     itemName = "" 
    } 
} 

func parser(parser: NSXMLParser, foundCharacters string: String) { 
    itemName?.appendContentsOf(string) 
} 

func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { 
    if elementName == "item" { 
     items.append(Item(name: itemName!, price: itemPrice!)) 
     itemName = nil 
     itemPrice = nil 
    } 
} 

當我做到這一點,並打印items,我得到:

[MyApp.ViewController.Item(名稱:「比薩「,價格:」$ 10「),
MyApp.ViewController.Item(name:」Salad「,price:」$ 5「),
MyApp.ViewController.Item(name:」Bread「,price:」$ 3「) ]

+0

如何打印特定商品編號的名稱或價格?例如,您將如何在列表中打印項目編號2的名稱或價格。 –

+0

'print(items [1] .name)'和'print(items [1] .price)' – Rob