我需要帮助从URL解析XML。我已经读了很多这方面的东西,但我想不出如何得到它。我发现的所有示例与示例以及如何从解析的XML数据中获取信息都有点模糊。
我将如何解析这个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 (Swift 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)
}
}
}发布于 2015-11-29 06:49:53
看起来解析器代码是从其他东西借来的。如果这确实是您的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(姓名:“沙拉”,价格:“5美元”), MyApp.ViewController.Item(名称:“面包”,价格:“3美元”)
https://stackoverflow.com/questions/33979865
复制相似问题