ios - 有没有更简单的方法将 XML 转换为 Plist?

标签 ios swift xml swxmlhash

我正在寻求有关将 XML 转换为 Swift 字典然后再转换为 Plist 的过程的帮助。

长话短说 我正在使用 SWXMLHash将 XML 解析为 Swift 字典,然后解析为 Plist,以便用户可以更轻松地编辑数据。解析工作正常,但我无法找到将 XMLIndexer 对象转换为字典的简单方法,而我正在做的方式让我认为应该有一种更简单/可能更复杂的方法来执行此操作。

详细信息:

这是一个与我正在处理的非常相似的示例 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

关于ios - 有没有更简单的方法将 XML 转换为 Plist?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57794158/

相关文章:

objective-c - 将包含图像、javascript 和 css 的 html 页面保存在 iphone 应用程序的一个文件夹中

Xcode 4.4.1 中 non_lazy_ptr 的 iOS SDK 5.1 链接器错误

ios - 如何在_启动期间而不是在xcode中启动后播放声音_

ios - 在最初被拒绝后,我如何获得隐私权限以重新出现?

c# - 使用 XDocument 读取 XML 时不解码转义字符

ios - UIView Animate 只有在 IBAction 中时才会动画。我如何让它在我的情况下动画?

arrays - 索引数组不打印数组中的元素

ios - 检查元素是否是数组中的数字

android - 无法将颜色转换为可绘制对象

android - 自定义 View 或膨胀布局?