diff --git a/Sources/XMLCoder/Auxiliaries/KeyedStorage.swift b/Sources/XMLCoder/Auxiliaries/KeyedStorage.swift index 3424266e..21485417 100644 --- a/Sources/XMLCoder/Auxiliaries/KeyedStorage.swift +++ b/Sources/XMLCoder/Auxiliaries/KeyedStorage.swift @@ -75,23 +75,3 @@ extension KeyedStorage: CustomStringConvertible { return "[\(result)]" } } - -extension KeyedStorage where Key == String, Value == Box { - func merge(element: XMLCoderElement) -> KeyedStorage { - var result = self - - let hasElements = !element.elements.isEmpty - let hasAttributes = !element.attributes.isEmpty - let hasText = element.stringValue != nil - - if hasElements || hasAttributes { - result.append(element.transformToBoxTree(), at: element.key) - } else if hasText { - result.append(element.transformToBoxTree(), at: element.key) - } else { - result.append(SingleKeyedBox(key: element.key, element: NullBox()), at: element.key) - } - - return result - } -} diff --git a/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift b/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift index 38fdc053..1efa1228 100644 --- a/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift +++ b/Sources/XMLCoder/Auxiliaries/XMLCoderElement.swift @@ -115,9 +115,25 @@ struct XMLCoderElement: Equatable { let attributes = KeyedStorage(self.attributes.map { attribute in (key: attribute.key, value: StringBox(attribute.value) as SimpleBox) }) - let storage = KeyedStorage() - let elements = self.elements.reduce(storage) { $0.merge(element: $1) } - return KeyedBox(elements: elements, attributes: attributes) + + var storage = KeyedStorage() + + for element in self.elements { + + let hasElements = !element.elements.isEmpty + let hasAttributes = !element.attributes.isEmpty + let hasText = element.stringValue != nil + + if hasElements || hasAttributes { + storage.append(element.transformToBoxTree(), at: element.key) + } else if hasText { + storage.append(element.transformToBoxTree(), at: element.key) + } else { + storage.append(SingleKeyedBox(key: element.key, element: NullBox()), at: element.key) + } + } + + return KeyedBox(elements: storage, attributes: attributes) } func toXMLString(