go语言xml处理

作者: 吃猫的鱼0 | 来源:发表于2018-02-12 11:34 被阅读0次

XML解析

设置要解析的对象

设置要解析的xml文件对象

type Result struct {
    XMLName xml.Name `xml:"persons"`//标签上的标签名
    Persons []Person `xml:"person"`
}
type Person struct {
    Name string `xml:"name,attr"`//persion标签属性名为name的属性值
    Age int `xml:"age,attr"`
    Career string `xml:"career"`//persion中标签名为career的值
    Interests []string `xml:"interests>interest"`//标签interests下的interest数组
    //不写>当子标签为一个的时候回把它当做对象解析
}

对应的xml文件
<?xml version="1.0" encoding="UTF-8"?>
<persons>
    <person name="polaris" age="28">
        <career>无业游民</career>
        <interests>
            <interest>编程</interest>
            <interest>下棋</interest>
        </interests>
    </person>
    <person name="studygolang" age="27">
        <career>码农</career>
        <interests>
            <interest>编程</interest>
            <interest>下棋</interest>
        </interests>
    </person>
</persons>

XML字符串读取

方法一:转对象
input := `<Person><FirstName>Xu</FirstName><LastName>Xinhua</LastName></Person>`
err := xml.Unmarshal([]byte(input), &v)//将文件转化成对象
方法二:遍历
package main

import (
    "encoding/xml"
    "strings"
    "fmt"
)

func main() {
    var t xml.Token
    var err error

    input := `<Person><FirstName>Xu</FirstName><LastName>Xinhua</LastName></Person>`
    inputReader := strings.NewReader(input)

    // 从文件读取,如可以如下:
    // content, err := ioutil.ReadFile("studygolang.xml")
    // decoder := xml.NewDecoder(bytes.NewBuffer(content))

    decoder := xml.NewDecoder(inputReader)
    for t, err = decoder.Token(); err == nil; t, err = decoder.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.Printf("Token of '%s' end\n", token.Name.Local)
        // 处理字符数据(这里就是元素的文本)
        case xml.CharData:
            content := string([]byte(token))
            fmt.Printf("This is the content: %v\n", content)
        default:
            // ...
        }
    }
}

XML文件读取

//从文件读取,如可以如下:
content, err := ioutil.ReadFile("studygolang.xml")
decoder := xml.NewDecoder(bytes.NewBuffer(content))
xml.Unmarshal(content, &result)//将文件转化成对象

生成xml

对象转换为xml

package 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"}
    v.Svs = append(v.Svs, server{"Shanghai_VPN", "127.0.0.1"})
    v.Svs = append(v.Svs, server{"Beijing_VPN", "127.0.0.2"})
    output, err := xml.MarshalIndent(v, "  ", "    ")
    if err != nil {
        fmt.Printf("error: %v\n", err)
    }
    // os.Stdout.Write([]byte(xml.Header))

    // os.Stdout.Write(output)
    //将字节流转换成string输出
    fmt.Println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"+string(output))
}

map与XML相互转换(只能解决简单的的xml)

package main

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

type Map map[string]string

type xmlMapEntry struct {
    XMLName xml.Name
    Value   string `xml:",chardata"`
}

// MarshalXML marshals the map to XML, with each key in the map being a
// tag and it's corresponding value being it's contents.
func (m Map) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
    if len(m) == 0 {
        return nil
    }

    err := e.EncodeToken(start)
    if err != nil {
        return err
    }

    for k, v := range m {
        e.Encode(xmlMapEntry{XMLName: xml.Name{Local: k}, Value: v})
    }

    return e.EncodeToken(start.End())
}

// UnmarshalXML unmarshals the XML into a map of string to strings,
// creating a key in the map for each tag and setting it's value to the
// tags contents.
//
// The fact this function is on the pointer of Map is important, so that
// if m is nil it can be initialized, which is often the case if m is
// nested in another xml structurel. This is also why the first thing done
// on the first line is initialize it.
func (m *Map) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
    *m = Map{}
    for {
        var e xmlMapEntry

        err := d.Decode(&e)
        if err == io.EOF {
            break
        } else if err != nil {
            return err
        }

        (*m)[e.XMLName.Local] = e.Value
    }
    return nil
}

func main() {
    // The Map
    m := map[string]string{
        "key_1": "Value One",
        "key_2": "Value Two",
    }
    fmt.Println(m)

    // Encode to XML
    x, _ := xml.MarshalIndent(Map(m), "", "  ")
    fmt.Println(string(x))

    // Decode back from XML
    var rm map[string]string
    xml.Unmarshal(x, (*Map)(&rm))
    fmt.Println(rm)
}

相关文章

  • go语言xml处理

    XML解析 设置要解析的对象 设置要解析的xml文件对象 XML字符串读取 方法一:转对象 方法二:遍历 XML文...

  • Go语言中的XML处理

    XML文件想必大家应该都不陌生吧,现在XML在日常的开发工作中也扮演了愈发重要的角色。接下来我们就一起来看看Go语...

  • Notepad++配置Golang关键字高亮

    1.Go语言支持包 下载到后,解压会得到两个xml,一个是userDefineLang_Go.xml,一个是go....

  • Go基础语法(九)

    Go语言并发 Go 是并发式语言,而不是并行式语言。 并发是指立即处理多个任务的能力。 Go 编程语言原生支持并发...

  • (译)Go 语言中异常处理的艺术

    原文链接:The Art of Error Handling in Go Go 语言的异常处理与其他语言截然不同,...

  • 异常处理

    异常处理 Go语言追求简洁优雅,所以,Go语言不支持传统的 try…catch…finally 这种异常,因为Go...

  • go环境以及kubernetes的go-client介绍

    1、go语言介绍: (1)Go语言是谷歌2009发布的第二款开源编程语言。 (2)Go语言专门针对多处理器系统应用...

  • go语言能做什么

    鉴于Go语言的特点和设计的初衷,Go语言作为服务器编程语言,很适合处理日志、数据打包、虚拟机处理、文件系统、分布式...

  • 异常处理

    Go 的异常处理不同于其他语言使用的结构 对于 go 的异常处理, 使用 defer, panic, recove...

  • Go语言之错误处理

    一. 异常处理 1. error接口 Go语言中引入了一个关于错误处理的标准模式error接口,是go语言的内置接...

网友评论

    本文标题:go语言xml处理

    本文链接:https://www.haomeiwen.com/subject/jkurtftx.html