关于golang:Go-xml文件处理

46次阅读

共计 2458 个字符,预计需要花费 7 分钟才能阅读完成。

在开发中会常遇到 xml 数据序列化和反序列化,这里咱们介绍 go 语言解决 xml 数据。
encoding/xml 包实现了一个简略的 xml 1.0 解析器,能够了解 xml 名称空间。

读取 xml

示例:

package main

import (
    "encoding/xml"
    "fmt"
)

type Note struct {
    XMLName  xml.Name `xml:"note"`
    To string `xml:"to"`
    From string `xml:"from"`
    Heading string `xml:"heading"`
    Body string `xml:"body"`
    Files FilesArr `xml:"files"`
}
type FilesArr struct {
    Flag string `xml:"flag,attr"` // 读取 flag 属性
    User []string `xml:"user"` // 读取 user 数组}
func main()  {// 读取 xml 文件到缓存中,返回 []byte
    //xmlDoc, err := ioutil.ReadFile("test.xml")
    //if err != nil {//    fmt.Println("xml 文件读取失败!")
    //    return
    //}
    //fmt.Println(string(xmlDoc))
    xmlDoc := `<?xml version="1.0" encoding="UTF-8"?>
                <note>
                  <to>Tony</to>
                  <from>jack</from>
                  <heading>title</heading>
                  <body>love you</body>
                  <files flag="true">
                    <user>zhang</user>
                    <user>li</user>
                  </files>
                </note>`
    note := Note{}
    err := xml.Unmarshal([]byte(xmlDoc), &note)
    if err != nil {fmt.Println(err.Error())
    } else {fmt.Println(note)
    }
}

读取递归数据 xml

package main

import (
    "encoding/xml"
    "fmt"
)
type ListItem struct {
    Name string `xml:"name"`
    List []ListItem `xml:"list"`}

func main()  {// 读取 xml 文件到缓存中,返回 []byte
    //xmlDoc, err := ioutil.ReadFile("test.xml")
    //if err != nil {//    fmt.Println("xml 文件读取失败!")
    //    return
    //}
    //fmt.Println(string(xmlDoc))
    xmlDoc := `<?xml version="1.0" encoding="UTF-8"?>
                <list>
                  <name>zhang</name>
                    <list>
                        <name>li</name>
                    </list>
                </list>`
    list := ListItem{}
    err := xml.Unmarshal([]byte(xmlDoc), &list)
    if err != nil {fmt.Println(err.Error())
    } else {fmt.Println(list)
    }
}


写入 xml

示例:

package main

import (
    "encoding/xml"
    "fmt"
    "io/ioutil"
)

type Note struct {
    XMLName  xml.Name `xml:"note"`
    To string `xml:"to"`
    From string `xml:"from"`
    Heading string `xml:"heading"`
    Body string `xml:"body"`
    Files FilesArr `xml:"files"`
}
type FilesArr struct {
    Flag string `xml:"flag,attr"` // 读取 flag 属性
    User []string `xml:"user"` // 读取 user 数组}
func main()  {user:=[]string{"zhang","li"}
    files:=FilesArr{Flag: "true",User: user}
    note:=Note{
        To: "tony",
        From: "jack",
        Heading: "title",
        Body: "love you",
        Files:files,
    }
    xmlContent,err:=xml.Marshal(note)
    if    err!=nil{fmt.Println(err)
    }
    fmt.Println(string(xmlContent))
    // 写入 demo.xml
    err=ioutil.WriteFile("demo.xml", xmlContent, 0666)
    if err!=nil{fmt.Println(err)
    }
}

写入递归数据

package main

import (
    "encoding/xml"
    "fmt"
    "io/ioutil"
)

type ListItem struct {
    XMLName  xml.Name `xml:"list"`
    Name string `xml:"name"`
    List []ListItem `xml:"list"`}

func main()  {list:=ListItem{Name: "li",List: nil}
    lists:=ListItem{Name: "zhang"}
    l := make([]ListItem,0)
    lists.List=append(l,list)
    xmlContent,err:=xml.Marshal(lists)
    if    err!=nil{fmt.Println(err)
    }
    fmt.Println(string(xmlContent))
    // 写入 demo.xml
    err=ioutil.WriteFile("demo.xml", xmlContent, 0666)
    if err!=nil{fmt.Println(err)
    }

}

links

https://studygolang.com/pkgdoc

  • 目录

正文完
 0