基于 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 元素里面。