added iOS source code
[wl-app.git] / iOS / Pods / AEXML / Sources / Parser.swift
1 import Foundation
2
3 /// Simple wrapper around `Foundation.XMLParser`.
4 internal class AEXMLParser: NSObject, XMLParserDelegate {
5     
6     // MARK: - Properties
7     
8     let document: AEXMLDocument
9     let data: Data
10     
11     var currentParent: AEXMLElement?
12     var currentElement: AEXMLElement?
13     var currentValue = String()
14     
15     var parseError: Error?
16     
17     private lazy var trimWhitespace: Bool = {
18         let trim = self.document.options.parserSettings.shouldTrimWhitespace
19         return trim
20     }()
21     
22     // MARK: - Lifecycle
23     
24     init(document: AEXMLDocument, data: Data) {
25         self.document = document
26         self.data = data
27         currentParent = document
28         
29         super.init()
30     }
31     
32     // MARK: - API
33     
34     func parse() throws {
35         let parser = XMLParser(data: data)
36         parser.delegate = self
37         
38         parser.shouldProcessNamespaces = document.options.parserSettings.shouldProcessNamespaces
39         parser.shouldReportNamespacePrefixes = document.options.parserSettings.shouldReportNamespacePrefixes
40         parser.shouldResolveExternalEntities = document.options.parserSettings.shouldResolveExternalEntities
41         
42         let success = parser.parse()
43         
44         if !success {
45             guard let error = parseError else { throw AEXMLError.parsingFailed }
46             throw error
47         }
48     }
49     
50     // MARK: - XMLParserDelegate
51     
52     func parser(_ parser: XMLParser,
53                       didStartElement elementName: String,
54                       namespaceURI: String?,
55                       qualifiedName qName: String?,
56                       attributes attributeDict: [String : String])
57     {
58         currentValue = String()
59         currentElement = currentParent?.addChild(name: elementName, attributes: attributeDict)
60         currentParent = currentElement
61     }
62     
63     func parser(_ parser: XMLParser, foundCharacters string: String) {
64         currentValue.append(trimWhitespace ? string.trimmingCharacters(in: .whitespacesAndNewlines) : string)
65         currentElement?.value = currentValue.isEmpty ? nil : currentValue
66     }
67     
68     func parser(_ parser: XMLParser,
69                       didEndElement elementName: String,
70                       namespaceURI: String?,
71                       qualifiedName qName: String?)
72     {
73         currentParent = currentParent?.parent
74         currentElement = nil
75     }
76     
77     func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) {
78         self.parseError = parseError
79     }
80     
81 }