@@ -35,87 +35,87 @@ import FoundationXML
3535#endif
3636
3737extension XML {
38-
39- final class SAXParser : NSObject , XMLParserDelegate {
40-
41- #if canImport(FoundationXML)
42- typealias FoundationXMLParser = FoundationXML . XMLParser
43- #else
44- typealias FoundationXMLParser = Foundation . XMLParser
45- #endif
46-
47- private let parser : FoundationXMLParser
48- private let namespaceURI = " http://www.w3.org/2000/svg "
49-
50- private var rootNode : Element ?
51- private var elements : [ Element ]
52-
53- private var currentElement : Element {
54- return elements. last!
55- }
56-
57- private init ( data: Data ) {
58- self . parser = FoundationXMLParser ( data: data)
59- elements = [ Element] ( )
60- super. init ( )
61-
62- self . parser. delegate = self
63- self . parser. shouldProcessNamespaces = true
64- }
65-
66- static func parse( data: Data ) throws -> Element {
67- let parser = SAXParser ( data: data)
68-
69- guard
70- parser. parser. parse ( ) ,
71-
72- let rootNode = parser. rootNode else {
73- throw XMLParser . Error. invalidDocument ( error: parser. parser. parserError,
74- element: parser. elements. last? . name,
75- line: parser. parser. lineNumber,
76- column: parser. parser. columnNumber)
77- }
78-
79- return rootNode
80- }
81-
82- static func parse( contentsOf url: URL ) throws -> Element {
83- let data = try Data ( contentsOf: url)
84- return try parse ( data: data)
85- }
86-
87- func parser( _ parser: FoundationXMLParser , didStartElement elementName: String , namespaceURI: String ? , qualifiedName _: String ? , attributes attributeDict: [ String : String ] = [ : ] ) {
88- guard
89- self . parser === parser,
90- namespaceURI == self . namespaceURI else {
91- return
92- }
93-
94- let element = Element ( name: elementName, attributes: attributeDict)
95- element. parsedLocation = ( line: parser. lineNumber, column: parser. columnNumber)
96-
97- elements. last? . children. append ( element)
98- elements. append ( element)
99-
100- if rootNode == nil {
101- rootNode = element
102- }
103- }
104-
105- func parser( _ parser: FoundationXMLParser , didEndElement elementName: String , namespaceURI: String ? , qualifiedName _: String ? ) {
106- guard
107- namespaceURI == self . namespaceURI,
108- currentElement. name == elementName else {
109- return
110- }
111-
112- elements. removeLast ( )
113- }
114-
115- func parser( _ parser: FoundationXMLParser , foundCharacters string: String ) {
116- guard let element = elements. last else { return }
117- let text = element. innerText. map { $0. appending ( string) }
118- element. innerText = text ?? string
38+
39+ final class SAXParser : NSObject , XMLParserDelegate {
40+
41+ #if canImport(FoundationXML)
42+ typealias FoundationXMLParser = FoundationXML . XMLParser
43+ #else
44+ typealias FoundationXMLParser = Foundation . XMLParser
45+ #endif
46+
47+ private let parser : FoundationXMLParser
48+ private let namespaceURI = " http://www.w3.org/2000/svg "
49+
50+ private var rootNode : Element ?
51+ private var elements : [ Element ]
52+
53+ private var currentElement : Element {
54+ return elements. last!
55+ }
56+
57+ private init ( data: Data ) {
58+ self . parser = FoundationXMLParser ( data: data)
59+ elements = [ Element] ( )
60+ super. init ( )
61+
62+ self . parser. delegate = self
63+ self . parser. shouldProcessNamespaces = true
64+ }
65+
66+ static func parse( data: Data ) throws -> Element {
67+ let parser = SAXParser ( data: data)
68+
69+ guard
70+ parser. parser. parse ( ) ,
71+
72+ let rootNode = parser. rootNode else {
73+ throw XMLParser . Error. invalidDocument ( error: parser. parser. parserError,
74+ element: parser. elements. last? . name,
75+ line: parser. parser. lineNumber,
76+ column: parser. parser. columnNumber)
77+ }
78+
79+ return rootNode
80+ }
81+
82+ static func parse( contentsOf url: URL ) throws -> Element {
83+ let data = try Data ( contentsOf: url)
84+ return try parse ( data: data)
85+ }
86+
87+ func parser( _ parser: FoundationXMLParser , didStartElement elementName: String , namespaceURI: String ? , qualifiedName _: String ? , attributes attributeDict: [ String : String ] = [ : ] ) {
88+ guard
89+ self . parser === parser,
90+ namespaceURI == self . namespaceURI else {
91+ return
92+ }
93+
94+ let element = Element ( name: elementName, attributes: attributeDict)
95+ element. parsedLocation = ( line: parser. lineNumber, column: parser. columnNumber)
96+
97+ elements. last? . children. append ( element)
98+ elements. append ( element)
99+
100+ if rootNode == nil {
101+ rootNode = element
102+ }
103+ }
104+
105+ func parser( _ parser: FoundationXMLParser , didEndElement elementName: String , namespaceURI: String ? , qualifiedName _: String ? ) {
106+ guard
107+ namespaceURI == self . namespaceURI,
108+ currentElement. name == elementName else {
109+ return
110+ }
111+
112+ elements. removeLast ( )
113+ }
114+
115+ func parser( _ parser: FoundationXMLParser , foundCharacters string: String ) {
116+ guard let element = elements. last else { return }
117+ let text = element. innerText. map { $0. appending ( string) }
118+ element. innerText = text ?? string
119+ }
119120 }
120- }
121121}
0 commit comments