Skip to content

Commit 6c12884

Browse files
authored
Merge pull request #2068 from YOCKOW/sr-10157
SR-10157: XMLParser shouldn't swap the parts of the element name.
2 parents 3f32d55 + c8bd73c commit 6c12884

File tree

2 files changed

+54
-6
lines changed

2 files changed

+54
-6
lines changed

Foundation/XMLParser.swift

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -296,13 +296,14 @@ internal func _NSXMLParserStartElementNs(_ ctx: _CFXMLInterface, localname: Unsa
296296
var qualifiedName: String? = nil
297297
if parser.shouldProcessNamespaces {
298298
namespaceURI = UTF8STRING(URI) ?? ""
299-
qualifiedName = elementName
300299
if let prefix = UTF8STRING(prefix) {
301-
qualifiedName = elementName + ":" + prefix
300+
qualifiedName = prefix + ":" + elementName
301+
} else {
302+
qualifiedName = elementName
302303
}
303304
}
304305
else if let prefix = UTF8STRING(prefix) {
305-
elementName = elementName + ":" + prefix
306+
elementName = prefix + ":" + elementName
306307
}
307308

308309
parser.delegate?.parser(parser, didStartElement: elementName, namespaceURI: namespaceURI, qualifiedName: qualifiedName, attributes: attrDict)
@@ -316,13 +317,14 @@ internal func _NSXMLParserEndElementNs(_ ctx: _CFXMLInterface , localname: Unsaf
316317
var qualifiedName: String? = nil
317318
if parser.shouldProcessNamespaces {
318319
namespaceURI = UTF8STRING(URI) ?? ""
319-
qualifiedName = elementName
320320
if let prefix = UTF8STRING(prefix) {
321-
qualifiedName = elementName + ":" + prefix
321+
qualifiedName = prefix + ":" + elementName
322+
} else {
323+
qualifiedName = elementName
322324
}
323325
}
324326
else if let prefix = UTF8STRING(prefix) {
325-
elementName = elementName + ":" + prefix
327+
elementName = prefix + ":" + elementName
326328
}
327329

328330
parser.delegate?.parser(parser, didEndElement: elementName, namespaceURI: namespaceURI, qualifiedName: qualifiedName)

TestFoundation/TestXMLParser.swift

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ class TestXMLParser : XCTestCase {
6666
("test_withDataEncodings", test_withDataEncodings),
6767
("test_withDataOptions", test_withDataOptions),
6868
("test_sr9758_abortParsing", test_sr9758_abortParsing),
69+
("test_sr10157_swappedElementNames", test_sr10157_swappedElementNames),
6970
]
7071
}
7172

@@ -154,4 +155,49 @@ class TestXMLParser : XCTestCase {
154155
XCTAssertNotNil(parser.parserError)
155156
}
156157

158+
func test_sr10157_swappedElementNames() {
159+
class ElementNameChecker: NSObject, XMLParserDelegate {
160+
let name: String
161+
init(_ name: String) { self.name = name }
162+
func parser(_ parser: XMLParser,
163+
didStartElement elementName: String,
164+
namespaceURI: String?,
165+
qualifiedName qName: String?,
166+
attributes attributeDict: [String: String] = [:])
167+
{
168+
if parser.shouldProcessNamespaces {
169+
XCTAssertEqual(self.name, qName)
170+
} else {
171+
XCTAssertEqual(self.name, elementName)
172+
}
173+
}
174+
func parser(_ parser: XMLParser,
175+
didEndElement elementName: String,
176+
namespaceURI: String?,
177+
qualifiedName qName: String?)
178+
{
179+
if parser.shouldProcessNamespaces {
180+
XCTAssertEqual(self.name, qName)
181+
} else {
182+
XCTAssertEqual(self.name, elementName)
183+
}
184+
}
185+
func check() {
186+
let elementString = "<\(self.name) />"
187+
var parser = XMLParser(data: elementString.data(using: .utf8)!)
188+
parser.delegate = self
189+
XCTAssertTrue(parser.parse())
190+
191+
// Confirm that the parts of QName is also not swapped.
192+
parser = XMLParser(data: elementString.data(using: .utf8)!)
193+
parser.delegate = self
194+
parser.shouldProcessNamespaces = true
195+
XCTAssertTrue(parser.parse())
196+
}
197+
}
198+
199+
ElementNameChecker("noPrefix").check()
200+
ElementNameChecker("myPrefix:myLocalName").check()
201+
}
202+
157203
}

0 commit comments

Comments
 (0)