go處理XML


XML 數據格式

對於如下的XML:

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

和 JSON 的方式一樣,XML 數據可以序列化為結構,或者從結構反序列化為 XML 數據;

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

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

JSON 數據格式

我們都比較熟悉 XML 格式(參閱 12.10);但有些時候 JSON(JavaScript Object Notation,參閱 http://json.org)被作為首選,主要是由於其格式上非常簡潔。通常 JSON 被用於 web 后端和瀏覽器之間的通訊,但是在其它場景也同樣的有用。

這是一個簡短的 JSON 片段:(與上面XML同義)

{
    "Person": {
        "FirstName": "Laura",
        "LastName": "Lynn"
    }
}

盡管 XML 被廣泛的應用,但是 JSON 更加簡潔、輕量(占用更少的內存、磁盤及網絡帶寬)和更好的可讀性,這也使它越來越受歡迎。

示例  json.go

// json.go
package main

import (
    "encoding/json"
    "fmt"
    "log"
    "os"
)

type Address struct {
    Type    string
    City    string
    Country string
}

type VCard struct {
    FirstName string
    LastName  string
    Addresses []*Address
    Remark    string
}

func main() {
    pa := &Address{"private", "Aartselaar", "Belgium"}
    wa := &Address{"work", "Boom", "Belgium"}
    vc := VCard{"Jan", "Kersschot", []*Address{pa, wa}, "none"}
    // fmt.Printf("%v: \n", vc) // {Jan Kersschot [0x126d2b80 0x126d2be0] none}:
    // JSON format:
    js, _ := json.Marshal(vc)
    fmt.Printf("JSON format: %s", js)
    // using an encoder:
    file, _ := os.OpenFile("vcard.json", os.O_CREATE|os.O_WRONLY, 0666)
    defer file.Close()
    enc := json.NewEncoder(file)
    err := enc.Encode(vc)
    if err != nil {
        log.Println("Error in encoding json")
    }
}

 

 

 

轉載自:https://github.com/unknwon/the-way-to-go_ZH_CN/blob/master/eBook/12.10.md


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM