August 2021
Beginner to intermediate
450 pages
6h 1m
Chinese
4.5节展示了如何用encoding/json包的Marshal和Unmarshal函数来把JSON文档解析为Go语言的数据结构。encoding/xml包提供了一个相似的API。当需要构造一个完整文档树的结构时这很方便,但对于很多程序这是不必要的。encoding/xml还为解析API提供了一个基于标记的底层XML。在这些API中,解析器读入输入文本,然后输出一个标记流。标记流中主要包含四种类型:StartElement、EndElement、CharData和Comment,这四种类型都是encoding/xml包中的一个具体类型。每次调用(*xml.Decoder).Token都会返回一个标记。
API相关的部分如下所示。
Token的接口没有任何方法,这也是一个可识别联合的典型示例。一个传统的接口(比如io.Reader)的目标是隐藏具体类型的细节,这样可以轻松创建满足接口的新实现,对于每一种实现,使用方的处理方式都是一样的。可识别联合类型的接口正好与之相反,它的实现类型是固定的而不是随意增加的,实现类型是暴露的而不是隐藏的。可识别联合类型很少有方法,操作它的函数经常会使用类型switch,然后对每种类型应用不同的逻辑。
下面的xmlselect程序提取并输出XML文档树中特定元素下的文本。利用上面的API,可以在一遍扫描中就完成这个任务,还不用生成相应的文档树。 ...