2015-11-29 62 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