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 开始。
这是一个微小的框架,带有一个小的 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 会这样做)。
只是一个关于如何调用解析器的微小演示。