Skip to content

Instantly share code, notes, and snippets.

@asaday
Created December 20, 2016 01:13
Show Gist options
  • Save asaday/174562aa8e58366a416a83b5a3551a23 to your computer and use it in GitHub Desktop.
Save asaday/174562aa8e58366a416a83b5a3551a23 to your computer and use it in GitHub Desktop.
public extension Data {
var JSONObject: NSObject {
return (try? JSONSerialization.jsonObject(with: self, options: .allowFragments)) as? NSObject ?? NSObject()
}
var XMLObject: Any {
let x = XMLParser()
return x.parse(self)
}
var string: String {
return String(data: self, encoding: String.Encoding.utf8) ?? ""
}
}
class XMLParser: NSObject, XMLParserDelegate {
class STK {
var name: String = ""
var value: String = ""
var result: [String: Any] = [:]
}
var stack: [STK] = []
func parse(_ data: Data) -> Any {
stack = [STK()]
let parser = Foundation.XMLParser(data: data)
parser.delegate = self
parser.parse()
// if stack[0].result.count == 0 { return nil }
return stack[0].result
}
func parser(_ parser: XMLParser, foundCharacters string: String) {
stack[stack.count - 1].value += string
}
func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String: String]) {
stack.append(STK())
stack[stack.count - 1].result = attributeDict
stack[stack.count - 1].name = elementName
}
func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
let s = stack[stack.count - 1]
let n = s.name
var r = s.result
let v = s.value.trim()
if !v.isEmpty { r["value"] = v }
stack.removeLast()
let x = stack[stack.count - 1]
if let rs = x.result[n] {
if var ra = rs as? [Any] {
ra.append(r)
x.result[n] = ra
} else {
x.result[n] = [rs, r]
}
} else {
x.result[n] = r
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment