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

  • 相关阅读:
    461. Hamming Distance
    342. Power of Four
    326. Power of Three
    368. Largest Divisible Subset java solutions
    95. Unique Binary Search Trees II java solutions
    303. Range Sum Query
    160. Intersection of Two Linked Lists java solutions
    88. Merge Sorted Array java solutions
    67. Add Binary java solutions
    14. Longest Common Prefix java solutions
  • 原文地址:https://www.cnblogs.com/ghj1976/p/golang-xml-xu-lie-hua-he-fan-xu-lie-hua.html
Copyright © 2011-2022 走看看