我是解析新手,找不到任何过时且未提出更多问题的教程。我正在尝试解析一个简单的xml文件url。xml非常简单:
<xml>
<record>
<EmpName>A Employee</EmpName>
<EmpPhone>111-222-3333</EmpPhone>
<EmpEmail>a@employee.com</EmpEmail>
<EmpAddress>12345 Fake Street</EmpAddress>
<EmpAddress1>MyTown, Mystate ZIP</EmpAddress1>
</record>
</xml>
并且只想将其保存为NSDictionary(标签作为键,数据作为值)。到目前为止,我所能成功完成的工作是在控制台中使用以下命令打印xml字符串:
let url = NSURL(string: "http://www.urlexample.com/file.xml")
let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in
println(NSString(data: data, encoding: NSUTF8StringEncoding))
}
print(task)
task.resume()
我浏览过所有发现的在线教程,这些教程要么过时,要么过于复杂。任何帮助表示赞赏。
过程很简单:
XMLParser
对象,并向其传递数据。delegate
为该解析器指定。因此,在Swift 3/4中,它看起来像:
let task = URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data, error == nil else {
print(error ?? "Unknown error")
return
}
let parser = XMLParser(data: data)
parser.delegate = self
if parser.parse() {
print(self.results ?? "No results")
}
}
task.resume()
问题是如何实现这些XMLParserDelegate
方法。三种关键方法是didStartElement
(准备接收字符的位置),foundCharacters
(处理解析的实际值的位置)和didEndElement
(保存结果的位置)。
您问过如何解析单个记录(即单个字典),但是我将向您展示一种更通用的模式来解析一系列记录,这是XML更为常见的情况。如果您不需要值数组(或只需获取第一个值),显然可以看到如何简化此过程。
// a few constants that identify what element names we're looking for inside the XML
// a few constants that identify what element names we're looking for inside the XML
let recordKey = "record"
let dictionaryKeys = Set<String>(["EmpName", "EmpPhone", "EmpEmail", "EmpAddress", "EmpAddress1"])
// a few variables to hold the results as we parse the XML
var results: [[String: String]]? // the whole array of dictionaries
var currentDictionary: [String: String]? // the current dictionary
var currentValue: String? // the current value for one of the keys in the dictionary
和
extension ViewController: XMLParserDelegate {
// initialize results structure
func parserDidStartDocument(_ parser: XMLParser) {
results = []
}
// start element
//
// - If we're starting a "record" create the dictionary that will hold the results
// - If we're starting one of our dictionary keys, initialize `currentValue` (otherwise leave `nil`)
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 = ""
}
}
// found characters
//
// - If this is an element we care about, append those characters.
// - If `currentValue` still `nil`, then do nothing.
func parser(_ parser: XMLParser, foundCharacters string: String) {
currentValue? += string
}
// end element
//
// - If we're at the end of the whole dictionary, then save that dictionary in our array
// - If we're at the end of an element that belongs in the dictionary, then save that value in the dictionary
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
if elementName == recordKey {
results!.append(currentDictionary!)
currentDictionary = nil
} else if dictionaryKeys.contains(elementName) {
currentDictionary![elementName] = currentValue
currentValue = nil
}
}
// Just in case, if there's an error, report it. (We don't want to fly blind here.)
func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) {
print(parseError)
currentValue = nil
currentDictionary = nil
results = nil
}
}
问题内容: 有没有最简单的方法来从URL解析JSON?我使用Gson找不到任何有用的示例。 问题答案: 首先,您需要下载URL(作为文本): 然后您需要解析它(这里有一些选项)。 GSON(完整示例): 输出:
问题内容: 我需要构建一个从URL解析域的函数。 因此, 要么 它应该返回 与 它应该返回。 问题答案: 签出: 不能很好地正确处理错误的URL,但是如果您通常期望不错的URL,那很好。
问题内容: 我在解析Json文件时遇到问题。尝试解析一个Json文件: 这是我为其定义的两个结构。 暂停结构: AttachedModel模型结构: 然后,我为其创建一个键和一个函数: 在功能上: 这是输出 问题是,即使有数据,该行也始终为假,并且转到“ 有人可以告诉我这里的问题在哪里吗? 问题答案: 为您的json创建此模型类: 然后,您可以像这样解析它:
问题内容: 有没有最简单的方法来从URL解析JSON?我使用Gson找不到任何有用的示例。 问题答案: 首先,你需要下载URL(作为文本): 然后你需要解析它(这里有一些选项)。 GSON(完整示例): 输出: 试试json.org上的Java API :
问题内容: 应用启动时,我需要将数据预加载到tableView中。所以我通过解析.csv文件来使用核心数据。为此,我正在关注本教程。这是我的parseCSV函数 这是我的示例.csv文件 但我在这条线上出现错误 致命错误:数组索引超出范围 我究竟做错了什么 ?请帮我。 问题答案: 您正在尝试解析文件路径而不是文件内容。 如果您更换 与: 那么代码将适用于您的示例文件。
如有任何帮助,将不胜感激。