Skip to content

Commit d7a1d23

Browse files
authored
Merge pull request #68 from mrotrifork/feature/escape-characters
Escape characters when making XML document
2 parents fb74602 + f76bf48 commit d7a1d23

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

SwiftyXMLParser/Accessor.swift

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -519,7 +519,7 @@ extension XML {
519519

520520
private func traverse(_ element: Element) -> String {
521521
let name = element.name
522-
let text = element.text ?? ""
522+
let text = escapeXMLCharacters(element.text ?? "")
523523
let attrs = element.attributes.map { (k, v) in "\(k)=\"\(v)\"" }.joined(separator: " ")
524524

525525
let childDocs = element.childElements.reduce("", { (result, element) in
@@ -532,5 +532,16 @@ extension XML {
532532
return "<\(name)\(attrs.isEmpty ? "" : " ")\(attrs)>\(text)\(childDocs)</\(name)>"
533533
}
534534
}
535+
536+
private func escapeXMLCharacters(_ string: String) -> String {
537+
let charactersToEscape = [
538+
["&", "&amp;"],
539+
["<", "&lt;"],
540+
[">", "&gt;"]
541+
]
542+
return charactersToEscape.reduce(string) {
543+
$0.replacingOccurrences(of: $1[0], with: $1[1], options: .literal, range: nil)
544+
}
545+
}
535546
}
536547
}

SwiftyXMLParserTests/ConverterTests.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,19 @@ class ConverterTests: XCTestCase {
117117
}
118118
}
119119

120+
func testMakeDocumentEscapingCharacters() throws {
121+
let element = XML.Element(name: "name", text: "me&you", childElements: [
122+
XML.Element(name: "child", text: "& < > &")
123+
])
124+
let converter = XML.Converter(XML.Accessor(element))
125+
126+
XCTAssertEqual(
127+
try converter.makeDocument(),
128+
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><name>me&amp;you<child>&amp; &lt; &gt; &amp;</child></name>",
129+
"escape characters when making xml document"
130+
)
131+
}
132+
120133
func testMakeDocumentWithoutAttributes() throws {
121134
let element = XML.Element(name: "name")
122135
let converter = XML.Converter(XML.Accessor(element))

0 commit comments

Comments
 (0)