golang的xml、json解析

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

xml

golang的xml處理主要應用Unmarshal、Marshal方法實現,解析一個xml到struct如下,首先是xml檔案:

<?xml version="1.0" encoding="utf-8"?><servers version="1.0">    <!--測試注釋server-->    <server desc="s1">        <serverName>Shanghai_VPN</serverName>        <serverIP>127.0.0.1</serverIP>    </server>    <server desc="s2">        <!---->        <serverName>Beijing_VPN</serverName>        <serverIP>127.0.0.2</serverIP>    </server></servers>

下面記錄下主要代碼:

// parse2xml project main.gopackage main import ( "encoding/xml"    "fmt"    "io/ioutil"    "os" ) type Recurlyservers struct { XMLName xml.Name `xml:"servers"` Version string `xml:"version,attr"` Svs []server `xml:"server"` Description string `xml:",innerxml"` } type server struct { XMLName xml.Name `xml:"server"` Desc string `xml:"desc,attr"` ServerName string `xml:"serverName"` ServerIP string `xml:"serverIP"` TestDesc string `xml:",innerxml"` } func main() { file, err := os.Open("servers.xml") if err != nil { fmt.Printf("%s", err.Error()) panic(err) } defer file.Close() data, err := ioutil.ReadAll(file) v := Recurlyservers{} err = xml.Unmarshal(data, &v) if err != nil { fmt.Printf("%s", err.Error()) panic(err) } fmt.Printf("%#v", v) }

列印結果:

可以發現Unmarshal解析時的一些規則:

1、解析使用struct的tag配置,通過底層反射實現

2、類型為xml.Name的struct欄位XMLName對應的是xml中的“父”節點名稱,如servers

3、*,attr對應的為當前父節點上的屬性名稱,如version,attr,對應的便是xml檔案中servers節點的version屬性

4、tag中僅寫一個名稱如serverName,表示serverName為節點名稱

5、對於某個struct中,innerxml的tag標註,該struct的屬性對應的資料為該struct相應的XMLName對應的xml下的所有內容,比如TestDesc對應的為server節點下的所有內容,Description對應的便是servers下的所有內容

 

由struct產生對應的xml,方法如下:

// struct2xmll project main.gopackage main import ( "encoding/xml"    "fmt"    "os" ) type Servers struct { XMLName xml.Name `xml:"servers"` Version string `xml:"version,attr"` Svs []server `xml:"server"` } type server struct { ServerName string `xml:"serverName"` ServerIP string `xml:"serverIP"` } func main() { v := &Servers{Version: "1.0"} v.Svs = append(v.Svs, server{"Shanghai_VPN", "127.0.0.1"}) v.Svs = append(v.Svs, server{"Beijing_VPN", "127.0.0.1"}) output, err := xml.MarshalIndent(v, " ", " ") if err != nil { fmt.Println(err.Error()) return } os.Stdout.Write([]byte(xml.Header)) file, err := os.Create("servers.xml") file.Write([]byte(xml.Header)) file.Write(output) }

產生的xml文檔:

 

json

將json字串解析為struct:

// jsonparse project main.gopackage main import ( "encoding/json"    "fmt" ) type Server struct { ServerName string `json:"serverName"` ServerIP string `json:"serverIP"` } type Serversslice struct { Servers []Server `json:"servers"` } func main() { var s Serversslice str := `{"servers":[{"serverName":"Shanghai_VPN","serverIP":"127.0.0.1"},{"serverName":"Beijing_VPN","serverIP":"192.168.20.132"}]}` json.Unmarshal([]byte(str), &s) fmt.Printf("%#v", s) }

結果:

 

將一個struct解析為json如下:

package main import ( "encoding/json"    "fmt" ) type Server struct { serverName string `json:"serverName"` ServerIP string `json:"serverIP"` } type ServersSlice struct { Servers []Server `json:"servers"` Desc string   `json:"desc"` } func main() { servers := []Server{{serverName: "admin", ServerIP: "192.168.20.131"}, {serverName: "admin1", ServerIP: "192.168.20.132"}} desc := "描述部分"    var ss ServersSlice ss.Desc = desc ss.Servers = servers js, _ := json.Marshal(ss) fmt.Printf("Json: %s", js) }

結果:

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.