SwiftyExpat

Swift2 Swift4 Swift5 macOS tuxOS Travis

Expat XML 解析器的简单封装。

更新日志

2019-10-04: 更新以支持 Swift 5.1 (即 Xcode 11)。

2018-04-27: 更新以支持 Swift 4.0.3 (即 Xcode 9.2)。 支持 Swift Package Manager。

2015-12-09: 更新以支持 Swift 2.1.1 (即 Xcode 7.3?)。

20xx-yy-zz: 更新以支持 Swift v0.2b5 (即 Xcode 7b5)。

注意: Swift 1.x 的 SwiftyExpat 版本使用了一个修改过的 Expat,它使用 blocks 代替 C 函数指针回调。 Swift 2 现在支持 C 函数指针调用,因此这个项目被重写以适应这一点。

目标

该项目包含两个目标

(SPM 设置将 Expat 作为一个独立的目标)

我建议您从查看 SwiftyExpatTests 开始。

SwiftyExpat

这是一个微小的框架,带有一个小的 Swift 类,使 API 更加友好。 虽然这并不是真正必要的 - 从 Swift 中使用 Expat 也很容易。

let p = Expat()
  .onStartElement   { name, attrs in print("<\(name) \(attrs)")       }
  .onEndElement     { name        in print(">\(name)")                }
  .onStartNamespace { prefix, uri in print("+NS[\(prefix)] = \(uri)") }
  .onEndNamespace   { prefix      in print("-NS[\(prefix)]")          }
  .onError          { error       in print("ERROR: \(error)")         }
p.write("<hello>world</hello>")
p.close()

原始 Expat API 像这样工作

let p = XML_ParserCreate("UTF-8")
defer { XML_ParserFree(p) }

XML_SetStartElementHandler(p) { _, name, attrs in
  print("start tag \(String.fromCString(name)!)")
}
XML_SetEndElementHandler  (p) { _, name in
  print("end tag \(String.fromCString(name)!)")
}

XML_Parse(p, "<hello/>", 8, 0)
XML_Parse(p, "", 0, 1)

你明白了吧 ...

注意: 原始 API 中的闭包不能捕获变量。 如果您需要传递上下文 (很可能 ...),您需要填充常规的 Expat '用户数据' 字段 (如果需要示例,wrapper 会这样做)。

SwiftyExpatTests

只是一个关于如何调用解析器的微小演示。

联系方式

@helje5 | helge@alwaysrightinstitute.com