12.10 XML 數據格式

下面是與 12.9 節 JSON 例子等價的 XML 版本:

<Person>
    <FirstName>Laura</FirstName>
    <LastName>Lynn</LastName>
</Person>

如同 json 包一樣,也有 Marshal()UnMarshal() 從 XML 中編碼和解碼數據;但這個更通用,可以從文件中讀取和寫入(或者任何實現了 io.Reader 和 io.Writer 接口的類型)

和 JSON 的方式一樣,XML 數據可以序列化爲結構,或者從結構反序列化爲 XML 數據;這些可以在例子 15.8(twitter_status.go)中看到。

encoding/xml 包實現了一個簡單的 XML 解析器(SAX),用來解析 XML 數據內容。下面的例子說明如何使用解析器:

示例 12.17 xml.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,通過字符串轉換讓其變得可讀性強一些。

鏈接

results matching ""

    No results matching ""