added iOS source code
[wl-app.git] / iOS / Pods / AEXML / Sources / Document.swift
1 import Foundation
2
3 /**
4     This class is inherited from `AEXMLElement` and has a few addons to represent **XML Document**.
5
6     XML Parsing is also done with this object.
7 */
8 open class AEXMLDocument: AEXMLElement {
9     
10     // MARK: - Properties
11     
12     /// Root (the first child element) element of XML Document **(Empty element with error if not exists)**.
13     open var root: AEXMLElement {
14         guard let rootElement = children.first else {
15             let errorElement = AEXMLElement(name: "Error")
16             errorElement.error = AEXMLError.rootElementMissing
17             return errorElement
18         }
19         return rootElement
20     }
21     
22     open let options: AEXMLOptions
23     
24     // MARK: - Lifecycle
25     
26     /**
27         Designated initializer - Creates and returns new XML Document object.
28      
29         - parameter root: Root XML element for XML Document (defaults to `nil`).
30         - parameter options: Options for XML Document header and parser settings (defaults to `AEXMLOptions()`).
31     
32         - returns: Initialized XML Document object.
33     */
34     public init(root: AEXMLElement? = nil, options: AEXMLOptions = AEXMLOptions()) {
35         self.options = options
36         
37         let documentName = String(describing: AEXMLDocument.self)
38         super.init(name: documentName)
39         
40         // document has no parent element
41         parent = nil
42         
43         // add root element to document (if any)
44         if let rootElement = root {
45             _ = addChild(rootElement)
46         }
47     }
48     
49     /**
50         Convenience initializer - used for parsing XML data (by calling `loadXMLData:` internally).
51      
52         - parameter xmlData: XML data to parse.
53         - parameter options: Options for XML Document header and parser settings (defaults to `AEXMLOptions()`).
54     
55         - returns: Initialized XML Document object containing parsed data. Throws error if data could not be parsed.
56     */
57     public convenience init(xml: Data, options: AEXMLOptions = AEXMLOptions()) throws {
58         self.init(options: options)
59         try loadXML(xml)
60     }
61     
62     /**
63         Convenience initializer - used for parsing XML string (by calling `init(xmlData:options:)` internally).
64
65         - parameter xmlString: XML string to parse.
66         - parameter encoding: String encoding for creating `Data` from `xmlString` (defaults to `String.Encoding.utf8`)
67         - parameter options: Options for XML Document header and parser settings (defaults to `AEXMLOptions()`).
68
69         - returns: Initialized XML Document object containing parsed data. Throws error if data could not be parsed.
70     */
71     public convenience init(xml: String,
72                             encoding: String.Encoding = String.Encoding.utf8,
73                             options: AEXMLOptions = AEXMLOptions()) throws
74     {
75         guard let data = xml.data(using: encoding) else { throw AEXMLError.parsingFailed }
76         try self.init(xml: data, options: options)
77     }
78     
79     // MARK: - Parse XML
80     
81     /**
82         Creates instance of `AEXMLParser` (private class which is simple wrapper around `XMLParser`)
83         and starts parsing the given XML data. Throws error if data could not be parsed.
84     
85         - parameter data: XML which should be parsed.
86     */
87     open func loadXML(_ data: Data) throws {
88         children.removeAll(keepingCapacity: false)
89         let xmlParser = AEXMLParser(document: self, data: data)
90         try xmlParser.parse()
91     }
92     
93     // MARK: - Override
94     
95     /// Override of `xml` property of `AEXMLElement` - it just inserts XML Document header at the beginning.
96     open override var xml: String {
97         var xml =  "\(options.documentHeader.xmlString)\n"
98         xml += root.xml
99         return xml
100     }
101     
102 }