随笔 - 934, 文章 - 0, 评论 - 249, 阅读 - 345万

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

golang xml序列化和反序列化

Posted on   蝈蝈俊  阅读(301)  评论(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

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
历史上的今天:
2020-02-16 photopea参考线
2013-02-16 LiteIDE下设置GOPATH
点击右上角即可分享
微信分享提示