zoukankan      html  css  js  c++  java
  • golang xml序列化和反序列化

    基于 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
    ", v.XMLName)
        fmt.Printf("Values: %#v
    ", v.FirstValue)
    
        for _, b := range v.Members {
            fmt.Printf("%s:%s:%d
    ", b.Name, b.StrValue, b.IntValue)
        }
    
        fmt.Println("")
    
        dd, err2 := xml.Marshal(v)
        if err2 != nil {
            fmt.Printf("err:%s
    ", err2.Error())
        }
        fmt.Printf("%s
    ", 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

  • 相关阅读:
    【转】jquery-取消冒泡
    【转】android如何浏览并选择图片 音频 视频
    ListView防止滑动变色的小技巧
    【转】 Android经验: proguard 阻碍 webview 正常工作
    【转】获取android设备 id
    【转】android 选取图片
    eclipse 配置git ssh登录
    android 开启或者隐藏软键盘
    【转】如何设置Android软键盘的默认不弹出?
    【转】中国人唯一不认可的成功——就是家庭的和睦,人生的平淡
  • 原文地址:https://www.cnblogs.com/ghj1976/p/golang-xml-xu-lie-hua-he-fan-xu-lie-hua.html
Copyright © 2011-2022 走看看