首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift 2中的XML解析(Xcode 7)

Swift 2中的XML解析(Xcode 7)
EN

Stack Overflow用户
提问于 2015-11-29 05:56:49
回答 1查看 4.3K关注 0票数 0

我需要帮助从URL解析XML。我已经读了很多这方面的东西,但我想不出如何得到它。我发现的所有示例与示例以及如何从解析的XML数据中获取信息都有点模糊。

我将如何解析这个XML

代码语言:javascript
复制
<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 (Swift 2)中,我将如何解析和访问这些信息。我知道这不是如何访问它,但我正在寻找类似于下面的代码。

代码语言:javascript
复制
print ("\(item[0].data)") // Pizza //
print ("\(item[0].price)") // $10 //

下面是教程中的代码,但我不知道如何访问从URL中解析的所有数据。如何编辑这段代码以适应我的结构?

代码语言:javascript
复制
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)

    }

    }

}
EN

回答 1

Stack Overflow用户

发布于 2015-11-29 06:49:53

看起来解析器代码是从其他东西借来的。如果这确实是您的XML,请认为它比这更简单。在您的情况下,唯一的诀窍是price不是一个元素,而是item元素的一个attributeDict。我可能会创建自己的自定义类型Item来捕获项目的名称和价格。

不管怎么说,你最终可能会有这样的结果:

代码语言:javascript
复制
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(姓名:“沙拉”,价格:“5美元”), MyApp.ViewController.Item(名称:“面包”,价格:“3美元”)

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

https://stackoverflow.com/questions/33979865

复制
相关文章

相似问题

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