有没有更简单的方法将 XML 转换为 Plist?
Any easier way to convert XML to Plist?
我正在寻求有关将 XML 转换为 Swift 字典然后转换为 Plist 的过程的帮助。
长话短说;博士
我正在使用 SWXMLHash 将 XML 解析为 Swift 字典,然后解析为 Plist,以便用户可以更轻松地编辑数据。解析工作正常,但我无法找到一种简单的方法将 XMLIndexer 对象转换为字典,而我正在做的方式让我认为应该有一种 easier/possibly 更复杂的方法来做到这一点.
详情:
这是一个示例 XML,它与我正在处理的非常相似:
let xmlSample1 = """
<?xml version="1.0" encoding="UTF-8"?>
<root name = "basic"
enabled = "true"
schema_ver = "1"
ver = “14.0.2”
>
<initial>
<actions>
<list name=“xxxx”> 1234 </list>
<anotherList name = “xxxx”>
1234
</anotherList>
<config items = "1" max_active = "1">
<primary=“A B C D” />
</config>
</actions>
</initial>
</root>
这就是我解析它的方式:
override func viewDidLoad() {
super.viewDidLoad()
do {
let parsedObject: Item = try SWXMLHash.parse(xmSample1)["root"].value()
convertToDict(parsedObject: parsedObject)
} catch let error {
print("error occured: ---> \(error)")
}
}
这是我的解析模型:
struct Item: XMLIndexerDeserializable {
let name: String
let enabled: String
let schema_ver: String
let ver: String
let actions: Actions
static func deserialize(_ node: XMLIndexer) throws -> Item {
return try Item(
name: node.value(ofAttribute: "name"),
enabled: node.value(ofAttribute: "enabled"),
schema_ver: node.value(ofAttribute: "schema_ver"),
policy_ver: node.value(ofAttribute: "ver"),
actions: node["initial"]["actions"].value()
)
}
}
这就是我转换成 Swift 字典的方式:
func convertToDict(parsedObject: Item) {
let dict = [
ItemKey.name : parsedObject.name,
ItemKey.enabled : parsedObject.enabled,
ItemKey.schema_ver : parsedObject.schema_ver,
ItemKey.ver : parsedObject.ver,
] as [String : Any]
do {
try PropertyListEncoder().encode(dict).write(to: fileURL)
print("saved to plist successfully")
} catch {
print(error)
}
}
真正的 XML 比样本大,因此转换为字典更加繁琐。有没有更好的方法或我错过的现成解决方案?
感谢您的帮助。
你可以让你的 Item
符合 Encodable
struct Item: XMLIndexerDeserializable, Encodable {
let name: String
let enabled: String
let schema_ver: String
let ver: String
let actions: Actions // this property would have to be Encodable as well
}
struct Actions: Encodable {...}
那你就不用字典了,跟你有的差不多。
func convertToPlist(item: Item) {
let encoder = PropertyListEncoder()
encoder.outputFormat = .binary
do {
let data = try encoder.encode(item)
let fileURL = URL(<where you want to save plist>)
try data.write(to: fileURL)
} catch {
// Handle error
print(error)
}
}
不确定如何缩小输出。 PropertyListEncoder
有几个不同的输出选项。 .binary
可能会稍微减小尺寸。
encoder.outputFormat = .binary
我正在寻求有关将 XML 转换为 Swift 字典然后转换为 Plist 的过程的帮助。
长话短说;博士 我正在使用 SWXMLHash 将 XML 解析为 Swift 字典,然后解析为 Plist,以便用户可以更轻松地编辑数据。解析工作正常,但我无法找到一种简单的方法将 XMLIndexer 对象转换为字典,而我正在做的方式让我认为应该有一种 easier/possibly 更复杂的方法来做到这一点.
详情:
这是一个示例 XML,它与我正在处理的非常相似:
let xmlSample1 = """
<?xml version="1.0" encoding="UTF-8"?>
<root name = "basic"
enabled = "true"
schema_ver = "1"
ver = “14.0.2”
>
<initial>
<actions>
<list name=“xxxx”> 1234 </list>
<anotherList name = “xxxx”>
1234
</anotherList>
<config items = "1" max_active = "1">
<primary=“A B C D” />
</config>
</actions>
</initial>
</root>
这就是我解析它的方式:
override func viewDidLoad() {
super.viewDidLoad()
do {
let parsedObject: Item = try SWXMLHash.parse(xmSample1)["root"].value()
convertToDict(parsedObject: parsedObject)
} catch let error {
print("error occured: ---> \(error)")
}
}
这是我的解析模型:
struct Item: XMLIndexerDeserializable {
let name: String
let enabled: String
let schema_ver: String
let ver: String
let actions: Actions
static func deserialize(_ node: XMLIndexer) throws -> Item {
return try Item(
name: node.value(ofAttribute: "name"),
enabled: node.value(ofAttribute: "enabled"),
schema_ver: node.value(ofAttribute: "schema_ver"),
policy_ver: node.value(ofAttribute: "ver"),
actions: node["initial"]["actions"].value()
)
}
}
这就是我转换成 Swift 字典的方式:
func convertToDict(parsedObject: Item) {
let dict = [
ItemKey.name : parsedObject.name,
ItemKey.enabled : parsedObject.enabled,
ItemKey.schema_ver : parsedObject.schema_ver,
ItemKey.ver : parsedObject.ver,
] as [String : Any]
do {
try PropertyListEncoder().encode(dict).write(to: fileURL)
print("saved to plist successfully")
} catch {
print(error)
}
}
真正的 XML 比样本大,因此转换为字典更加繁琐。有没有更好的方法或我错过的现成解决方案?
感谢您的帮助。
你可以让你的 Item
符合 Encodable
struct Item: XMLIndexerDeserializable, Encodable {
let name: String
let enabled: String
let schema_ver: String
let ver: String
let actions: Actions // this property would have to be Encodable as well
}
struct Actions: Encodable {...}
那你就不用字典了,跟你有的差不多。
func convertToPlist(item: Item) {
let encoder = PropertyListEncoder()
encoder.outputFormat = .binary
do {
let data = try encoder.encode(item)
let fileURL = URL(<where you want to save plist>)
try data.write(to: fileURL)
} catch {
// Handle error
print(error)
}
}
不确定如何缩小输出。 PropertyListEncoder
有几个不同的输出选项。 .binary
可能会稍微减小尺寸。
encoder.outputFormat = .binary