Files
the-way-to-go_ZH_CN/eBook/12.10.md
Haigang Zhou d29644465a 第十二章修改 (#838)
Co-authored-by: Joe Chen <jc@unknwon.io>
2022-05-12 21:59:20 +08:00

86 lines
2.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 12.10 XML 数据格式
下面是与 [12.9 节](12.9.md) JSON 例子等价的 XML 版本:
```xml
<Person>
<FirstName>Laura</FirstName>
<LastName>Lynn</LastName>
</Person>
```
如同 `json` 包一样,也有 `xml.Marshal()``xml.Unmarshal()` 从 XML 中编码和解码数据;但这个更通用,可以从文件中读取和写入(或者任何实现了 `io.Reader``io.Writer` 接口的类型)
和 JSON 的方式一样XML 数据可以序列化为结构,或者从结构反序列化为 XML 数据;这些可以在例子 15.8[twitter_status.go](examples/chapter_15/twitter_status.go))中看到。
`encoding`/`xml` 包实现了一个简单的 XML 解析器SAX用来解析 XML 数据内容。下面的例子说明如何使用解析器:
示例 12.17 [xml.go](examples/chapter_12/xml.go)
```go
// xml.go
package main
import (
"encoding/xml"
"fmt"
"strings"
)
var t, token xml.Token
var err error
func main() {
input := "<Person><FirstName>Laura</FirstName><LastName>Lynn</LastName></Person>"
inputReader := strings.NewReader(input)
p := xml.NewDecoder(inputReader)
for t, err = p.Token(); err == nil; t, err = p.Token() {
switch token := t.(type) {
case xml.StartElement:
name := token.Name.Local
fmt.Printf("Token name: %s\n", name)
for _, attr := range token.Attr {
attrName := attr.Name.Local
attrValue := attr.Value
fmt.Printf("An attribute is: %s %s\n", attrName, attrValue)
// ...
}
case xml.EndElement:
fmt.Println("End of token")
case xml.CharData:
content := string([]byte(token))
fmt.Printf("This is the content: %v\n", content)
// ...
default:
// ...
}
}
}
```
输出:
```
Token name: Person
Token name: FirstName
This is the content: Laura
End of token
Token name: LastName
This is the content: Lynn
End of token
End of token
```
包中定义了若干 XML 标签类型StartElementChardata这是从开始标签到结束标签之间的实际文本EndElementCommentDirective 或 ProcInst。
包中同样定义了一个结构解析器:`NewParser()` 方法持有一个 `io.Reader`(这里具体类型是 `strings.NewReader`)并生成一个解析器类型的对象。还有一个 `Token()` 方法返回输入流里的下一个 XML token。在输入流的结尾处会返回 (`nil`,`io.EOF`)
XML 文本被循环处理直到 `Token()` 返回一个错误,因为已经到达文件尾部,再没有内容可供处理了。通过一个 type-switch 可以根据一些 XML 标签进一步处理。Chardata 中的内容只是一个 `[]byte`,通过字符串转换让其变得可读性强一些。
## 链接
- [目录](directory.md)
- 上一节:[Json 数据格式](12.9.md)
- 下一节:[用 Gob 传输数据](12.11.md)