导航

golang xml序列化和反序列化

Posted on 2021-02-16 21:12  蝈蝈俊  阅读(280)  评论(0编辑  收藏  举报

基于 encoding/xml

示例代码

package main

import (
    "encoding/xml"
    "fmt"
)

// omitempty 如果是默认值,就不参与序列化
type Member struct {
    Name     string `xml:"name"`
    StrValue string `xml:"value>string,omitempty"`
    IntValue int    `xml:"value>int,omitempty"`
}

type Result struct {
    XMLName    xml.Name `xml:"methodResponse"`
    FirstValue string   `xml:"params>param>value>array>data>value>string"`
    Members    []Member `xml:"params>param>value>array>data>value>struct>member"`
}

func main() {
    data := `
    <methodResponse>
    <params>
    <param>
    <value><array><data>
    <value><string>12345abcde12345abcde12345</string></value>
    <value><struct>
    <member>
      <name>username</name>
      <value><string>trex</string></value>
    </member>
    <member>
      <name>home</name>
      <value><string>/home</string></value>
    </member>
    <member>
      <name>mail_server</name>
      <value><string>Mailbox1</string></value>
    </member>
    <member>
      <name>web_server</name>
      <value><string>Web12</string></value>
    </member>
    <member>
      <name>id</name>
      <value><int>1234</int></value>
    </member>
    </struct></value>
    </data></array></value>
    </param>
    </params>
    </methodResponse>`

    v := Result{}
    err := xml.Unmarshal([]byte(data), &v)
    if err != nil {
        fmt.Printf("error: %v", err)
        return
    }
    fmt.Printf("XMLName: %#v\n", v.XMLName)
    fmt.Printf("Values: %#v\n", v.FirstValue)

    for _, b := range v.Members {
        fmt.Printf("%s:%s:%d\n", b.Name, b.StrValue, b.IntValue)
    }

    fmt.Println("")

    dd, err2 := xml.Marshal(v)
    if err2 != nil {
        fmt.Printf("err:%s\n", err2.Error())
    }
    fmt.Printf("%s\n", string(dd))
}

** 作为字段的标签说明: **

  • 带有 “-” 标签的字段会被忽略
  • 带有 “name,attr” 标签的字段会成为 XML 元素的属性, 其中属性的名字为这里给定的 name
  • 带有 “,attr” 标签的字段会成为 XML 元素的属性, 其中属性的名字为字段的名字
  • 带有 “,chardata” 标签的字段将会被封装为字符数据而不是 XML 元素。
  • 带有 “,cdata” 标签的字段将会被封装为字符数据而不是 XML 元素, 并且这些数据还会被一个或多个 <![CDATA[ … ]]> 标签包围。
  • 带有 “,innerxml” 标签的字段无需进行任何封装, 它会以原样进行输出。
  • 带有 “,comment” 标签的字段无需进行任何封装, 它会直接输出为 XML 注释。 这个字段内部不能包含 “–” 字符串。
  • 如果字段的标签中包含 “omitempty” 选项, 那么在字段的值为空时, 这个字段将被忽略。 空值指的是 false , 0 ,为 nil 的指针、接口值、数组、切片、map ,以及长度为 0 的字符串。
  • 匿名结构字段会被看作是外层结构的其中一部分来处理。
  • 字段可以使用类似 “a>b>c” 这样的标签来说明元素 c 被嵌套在父元素 a 和 b 里面。 如果有多个字段紧挨在一起, 并且它们都拥有相同的父元素, 那么这些字段对应的元素将被包裹在同一个 XML 元素里面。

参考:https://blog.huangz.me/2017/go-stdlib-encoding-xml.html