menu arrow_back 湛蓝安全空间 |狂野湛蓝,暴躁每天 chevron_right All_wiki chevron_right the-way-to-go_ZH_CN chevron_right eBook chevron_right 12.10.md
  • home 首页
  • brightness_4 暗黑模式
  • cloud
    xLIYhHS7e34ez7Ma
    cloud
    湛蓝安全
    code
    Github
    12.10.md
    2.79 KB / 2024-07-16 23:14:28
        # 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 标签类型:StartElement,Chardata(这是从开始标签到结束标签之间的实际文本),EndElement,Comment,Directive 或 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)
    
    
    links
    file_download