XML 编码器

Swift CI

这是一个 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 是一个协议,它具有两个静态函数 decodeencode。 这些函数用于为对象提供自定义编码和解码。 该库提供了用于数组和字典的 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]
}

对于定义字典编码和解码也有类似的结构。 只是它们有三个可能的变量,每个元素节点的名称、键节点的名称和值节点的名称。