如何解决Swift中针对Planet XML的XML解析
在UI上单击按钮时,当前输出为空数组或[]
,以及一个类似于Optional(1337 bytes)
的可选内容。这来自代码print(self.result)
和print(data)
。我感到困惑的是,我打电话给print(self.result)
之后该怎么办。我实际上如何解析传入的数据?感谢您的提前帮助。
注意:UI仅有一个按钮,可触发查找功能和两个文本字段。
预期结果:当按钮触发时,我可以访问xml数据以放入UI的文本字段中。目标数据是行星的名称和直径km。
更新11/9/20:将委托函数移至查找函数后未返回任何结果
行星xml
<planet name="Mercury" moonCount="0" distanceFromSun="0.39" diameterKm="4878"> </planet>
<planet name="Venus" moonCount="0" distanceFromSun="0.72" diameterKm="12104"> </planet>
<planet name="Earth" moonCount="1" distanceFromSun="1" diameterKm="12756"> </planet>
<planet name="Mars" moonCount="2" distanceFromSun="1.52" diameterKm="6787">
...
</planet>
<planet name="Jupiter" moonCount="63" distanceFromSun="5.2" diameterKm="142800">
<satellite name="Io" diameterKm="3630"/>
<satellite name="Europa" diameterKm="3138"/>
<satellite name="Ganymede" diameterKm="5262"/>
<satellite name="Callisto" diameterKm="4800"/>
</planet>
<planet name="Saturn" moonCount="62" distanceFromSun="9.54" diameterKm="120000"> </planet>
<planet name="Uranus" moonCount="27" distanceFromSun="19.8" diameterKm="51118"> </planet>
<planet name="Neptune" moonCount="13" distanceFromSun="30.06" diameterKm="49528"> </planet>
<dwarfPlanet name="Pluto" moonCount="3" distanceFromSun="39.44" diameterKm="2300">
<satellite name="Charon" diameterKm="1207"/>
</dwarfPlanet>
<dwarfPlanet name="Ceres" moonCount="0" distanceFromSun="2.76" diameterKm="974.6"> </dwarfPlanet>
<dwarfPlanet name="Eris" moonCount="1" distanceFromSun="67.67" diameterKm="3000"> </dwarfPlanet>
</planets>
ViewController
// ViewController.swift
// Project 5
//
// Created by Gracias Claude on 11/8/20.
//
import UIKit
class ViewController: UIViewController,XMLParserDelegate {
var results: [[String: String]]? // the whole array of dictionaries
var currentDictionary: [String: String]? // the current dictionary
var currentValue: String?
let recordKey = "planets"
let dictionaryKeys = Set<String>(["planet"])
@IBOutlet weak var Name: UITextField!
@IBOutlet weak var diameterText: UITextField!
var downloader = Downloader();
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func find(_ sender: Any) {
//saves the data to a file
// if var URL = NSURL(string: "http:universe.tc.uvu.edu/cs3680/project/p5/planets.xml") {
// Downloader.load(URL: URL)
// }
// downloader.getXml(url:"http:universe.tc.uvu.edu/cs3680/project/p5/planets.xml")
// }
let request = NSMutableURLRequest(url: NSURL(string: "http:universe.tc.uvu.edu/cs3680/project/p5/planets.xml")! as URL,cachePolicy: .useProtocolCachePolicy,timeoutInterval: 10.0)
request.httpMethod = "GET"
let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest,completionHandler: { (data,response,error) -> Void in
if (error != nil) {
print(error!)
} else {
let httpResponse = response as? HTTPURLResponse
//print(httpResponse!)
print(data)
let parser = XMLParser.init(data: data!)
parser.delegate = self
if parser.parse() {
print(self.results ?? "No results")
}
}
})
dataTask.resume()
}
func parserDidStartDocument(_ parser: XMLParser) {
results = []
}
func parser(_ parser: XMLParser,didStartElement elementName: String,namespaceURI: String?,qualifiedName qName: String?,attributes attributeDict: [String : String]) {
if elementName == recordKey {
currentDictionary = [:]
} else if dictionaryKeys.contains(elementName) {
currentValue = ""
}
}
func parser(_ parser: XMLParser,parseErrorOccurred parseError: Error) {
print(parseError)
currentValue = nil
currentDictionary = nil
results = nil
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。