自定义 XML 解析器 - 当某些键不存在时怎么办?
Custom XML Parser - what to do when some keys don't exist?
好的,我正在处理 ,解析器会在 XML:
中查找这些键
struct RSSChannel: Codable {
var title: String
var pubDate: Date
var link: URL
var description: String
var items: [RSSItem]
enum CodingKeys: String, CodingKey {
case title, pubDate, link, description
case items = "item"
}
}'
(不是我写的,这是GitHub所以我在这里挣扎)-
我需要知道如何在提要(即发布日期)中不存在键时阻止解析器出错。在XML解码器class中,有所有这些解码器:
public func decode(_ type: UInt.Type) throws -> UInt {
try expectNonNull(UInt.self)
return try self.unbox(self.storage.topContainer, as: UInt.self)!
}
public func decode(_ type: UInt8.Type) throws -> UInt8 {
try expectNonNull(UInt8.self)
return try self.unbox(self.storage.topContainer, as: UInt8.self)!
}
public func decode(_ type: UInt16.Type) throws -> UInt16 {
try expectNonNull(UInt16.self)
return try self.unbox(self.storage.topContainer, as: UInt16.self)!
}
public func decode(_ type: UInt32.Type) throws -> UInt32 {
try expectNonNull(UInt32.self)
return try self.unbox(self.storage.topContainer, as: UInt32.self)!
}
public func decode(_ type: UInt64.Type) throws -> UInt64 {
try expectNonNull(UInt64.self)
return try self.unbox(self.storage.topContainer, as: UInt64.self)!
}
public func decode(_ type: Float.Type) throws -> Float {
try expectNonNull(Float.self)
return try self.unbox(self.storage.topContainer, as: Float.self)!
}
public func decode(_ type: Double.Type) throws -> Double {
try expectNonNull(Double.self)
实际上是:
public func decode<T : Decodable>(_ type: T.Type, forKey key: Key) throws -> T {
guard let entry = self.container[key.stringValue] else {
print("SKYaw")
throw DecodingError.keyNotFound(key, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "No value associated with key \(key) (\"\(key.stringValue)\")."))
}
self.decoder.codingPath.append(key)
defer { self.decoder.codingPath.removeLast() }
guard let value = try self.decoder.unbox(entry, as: type) else {
throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "Expected \(type) value but found null instead."))
}
return value
}
一堆这样的。当它说 "No key associated with Key"/ 抛出错误时,有没有人 运行 遇到问题?我怎样才能用这个库解决这个问题?
在 XML 解析库中,如果 属性 可能不存在于数据中,则需要将其设为可选。
如果 JSON.
中不存在该值,这类似于您在 Apple 的 JSON 解码器中发现的行为
在您的示例中,您提到 pubDate
可能不存在于您的 XML 中,因此更新后的频道结构将如下所示:
struct RSSChannel: Codable {
var title: String
var pubDate: Date?
var link: URL
var description: String
var items: [RSSItem]
enum CodingKeys: String, CodingKey {
case title, pubDate, link, description
case items = "item"
}
}
因此,如果 pubDate
确实存在于您的 XML 中,那么 属性 中就会有一个日期。在 XML 中不存在密钥的情况下,pubDate
的值将是 nil
.
您可以在结构中将任意数量的属性设为可选,它们都将遵循此模式。
好的,我正在处理
struct RSSChannel: Codable {
var title: String
var pubDate: Date
var link: URL
var description: String
var items: [RSSItem]
enum CodingKeys: String, CodingKey {
case title, pubDate, link, description
case items = "item"
}
}'
(不是我写的,这是GitHub所以我在这里挣扎)-
我需要知道如何在提要(即发布日期)中不存在键时阻止解析器出错。在XML解码器class中,有所有这些解码器:
public func decode(_ type: UInt.Type) throws -> UInt {
try expectNonNull(UInt.self)
return try self.unbox(self.storage.topContainer, as: UInt.self)!
}
public func decode(_ type: UInt8.Type) throws -> UInt8 {
try expectNonNull(UInt8.self)
return try self.unbox(self.storage.topContainer, as: UInt8.self)!
}
public func decode(_ type: UInt16.Type) throws -> UInt16 {
try expectNonNull(UInt16.self)
return try self.unbox(self.storage.topContainer, as: UInt16.self)!
}
public func decode(_ type: UInt32.Type) throws -> UInt32 {
try expectNonNull(UInt32.self)
return try self.unbox(self.storage.topContainer, as: UInt32.self)!
}
public func decode(_ type: UInt64.Type) throws -> UInt64 {
try expectNonNull(UInt64.self)
return try self.unbox(self.storage.topContainer, as: UInt64.self)!
}
public func decode(_ type: Float.Type) throws -> Float {
try expectNonNull(Float.self)
return try self.unbox(self.storage.topContainer, as: Float.self)!
}
public func decode(_ type: Double.Type) throws -> Double {
try expectNonNull(Double.self)
实际上是:
public func decode<T : Decodable>(_ type: T.Type, forKey key: Key) throws -> T {
guard let entry = self.container[key.stringValue] else {
print("SKYaw")
throw DecodingError.keyNotFound(key, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "No value associated with key \(key) (\"\(key.stringValue)\")."))
}
self.decoder.codingPath.append(key)
defer { self.decoder.codingPath.removeLast() }
guard let value = try self.decoder.unbox(entry, as: type) else {
throw DecodingError.valueNotFound(type, DecodingError.Context(codingPath: self.decoder.codingPath, debugDescription: "Expected \(type) value but found null instead."))
}
return value
}
一堆这样的。当它说 "No key associated with Key"/ 抛出错误时,有没有人 运行 遇到问题?我怎样才能用这个库解决这个问题?
在 XML 解析库中,如果 属性 可能不存在于数据中,则需要将其设为可选。
如果 JSON.
中不存在该值,这类似于您在 Apple 的 JSON 解码器中发现的行为在您的示例中,您提到 pubDate
可能不存在于您的 XML 中,因此更新后的频道结构将如下所示:
struct RSSChannel: Codable {
var title: String
var pubDate: Date?
var link: URL
var description: String
var items: [RSSItem]
enum CodingKeys: String, CodingKey {
case title, pubDate, link, description
case items = "item"
}
}
因此,如果 pubDate
确实存在于您的 XML 中,那么 属性 中就会有一个日期。在 XML 中不存在密钥的情况下,pubDate
的值将是 nil
.
您可以在结构中将任意数量的属性设为可选,它们都将遵循此模式。