SWXMLHash 的反序列化错误

Deserialisation error with SWXMLHash

我有以下 XML 结构(这是一个精简的例子):

<Root>
    <SomeData>Some value</SomeData>
    ...
    <ClientInfo>
        <Client>MD</Client>
        <Name>Massive Dynamic</Name>
    </ClientInfo>
</Root>

使用以下型号:

struct ClientInfo : XMLElementDeserializable {
    let Client : String
    let Name : String

    static func deserialize(_ node: XMLIndexer) throws -> ClientInfo {
        return try ClientInfo(
            Client: node["Client"].value(),
            Name: node["Name"].value()
        )
    }
}

我正在尝试按如下方式解析 XML:

let clientInfo : ClientInfo? = try? xml.children[0]["ClientInfo"].value()

但是,它一直失败并显示 ImplementationIsMissing 错误,就好像我的自定义 deserialize 函数不存在一样。

什么给了?

您快完成了,只是一个小错误...您应该使用 XMLIndexerDeserializable.

而不是 XMLElementDeserializable

以下在 Playground 中对我有用:

import SWXMLHash

let xmlData = "<Root>" +
"<SomeData>Some value</SomeData>" +
"    <ClientInfo>" +
"       <Client>MD</Client>" +
"       <Name>Massive Dynamic</Name>" +
"   </ClientInfo>" +
"</Root>"

let xml = SWXMLHash.parse(xmlData)

struct ClientInfo : XMLIndexerDeserializable {
    let Client: String
    let Name: String

    static func deserialize(_ node: XMLIndexer) throws -> ClientInfo {
        return try ClientInfo(
            Client: node["Client"].value(),
            Name: node["Name"].value()
        )
    }
}

let info: ClientInfo? = try? xml.children[0]["ClientInfo"].value()

这两者之间的区别有点令人困惑,它肯定需要在库中进行改进。要点是 XMLElementDeserializable 适用于没有子节点的独立类型(例如字符串、整数、日期等)。