这是一个 XML 编码器和解码器,与 Swift Codable 系统集成。它可以从 Codable 类创建 XML 树,也可以从 XML 树创建 Codable 类。 编码器使用自己的 XML 类,这些类相当接近 macOS 和 Linux Foundation 类中 XMLNode 类的格式。
从 Codable 类或结构体保存 XML 文件的基本方法如下:
let xml = try XMLEncoder().encode(codable)
let xmlString = xml.xmlString
以及从 XML 数据创建 Codable 类:
let xmlDocument = try XML.Document(data: data)
let codable = try XMLDecoder().decode(Codable.self, from: xmlDocument.rootElement)
参考文档可以在这里找到。
在 XML 中,集合的编码方式可能会有很大差异。 在该库的早期版本中,我尝试在编码器/解码器中实现这一点。 我已经删除了这段代码,转而使用 codable 属性包装器。 这些允许我们标记类的成员变量,以说明我们希望它们如何序列化。 该库提供了一系列属性包装器来控制集合序列化。 有两个属性包装器,@CustomCoding
用于非可选成员变量,@CustomOptionalCoding
用于可选成员变量。 两个属性包装器都有一个 CustomCoder
泛型变量。 此 CustomCoder
是一个协议,它具有两个静态函数 decode
和 encode
。 这些函数用于为对象提供自定义编码和解码。 该库提供了用于数组和字典的 CustomCoder
类。
默认情况下,像下面这样的对象
struct Object {
var array: [Int]
}
将序列化为如下内容
<Object><array>1</array><array>2</array><array>3</array><array>4</array></Object>
通过使用 ArrayCoder
对象和 ArrayCoderProperties
对象来定义元素名称,以及 @CustomCoding
属性包装器
struct Object {
struct MyArrayCoderProperties: ArrayCoderProperties { static let member = "member" }
@CustomCoding<ArrayCoder<MyArrayCoderProperties, Int>>
var array: [Int]
}
现在它将序列化为如下内容
<Object><array><member>1</member><member>2</member><member>3</member><member>4</member></array></Object>
对于常见的元素名称 “member”,有一个类型别名 DefaultArrayCoder
,它可以稍微减少代码的冗长性。有了这个,结构体看起来会像这样。
struct Object {
@CustomCoding<DefaultArrayCoder> var array: [Int]
}
对于定义字典编码和解码也有类似的结构。 只是它们有三个可能的变量,每个元素节点的名称、键节点的名称和值节点的名称。