Golang解析和封装XML
解析XML成结构体Demo
package main
import (
"encoding/xml"
"fmt"
)
//我们通过定义一个结构体,来解析xml
//注意,结构体中的字段必须是可导出的
type Books struct {
//如果有类型为xml.Name的XMLName字段,则解析时会保存元素名到该字段
XMLName xml.Name `xml:"books"`
//定义的字段中包含,attr,则解析时会把对应字段的属性值赋给该字段
Nums int `xml:"nums,attr"`
//定义的字段名含有xml中元素名,则解析时会把该元素值赋给该字段
Book []Book `xml:"book"`
//字段类型为string或[]byte,并且包含,innerxml,则解析时会把此字段对应的元素内所有原始xml累加到字段上
//Data string `xml:",innerxml"`
//字段定义包含-,则解析时不会为该字段匹配任何数据
//Tmp int `xml:"-"`
}
type Book struct {
XMLName xml.Name `xml:"book"`
Name string `xml:"name,attr"`
Author string `xml:"author"`
Time string `xml:"time"`
//字段定义如a>b>c,这样,解析时会从xml当前节点向下寻找元素并将值赋给该字段
Types []string `xml:"types>type"`
//字段定义有,any,则解析时如果xml元素没有与任何字段匹配,那么这个元素就会映射到该字段
Test string `xml:",any"`
}
func main() {
//xml数据字符串
data := `<?xml version="1.0" encoding="utf-8"?>
<books nums="2">
<book name="思想">
<author>小张</author>
<time>2018年1月20日</time>
<types>
<type>教育</type>
<type>历史</type>
</types>
<test>我是多余的</test>
</book>
<book name="政治">
<author>小王</author>
<time>2018年1月20日</time>
<types>
<type>科学</type>
<type>人文</type>
</types>
<test>我是多余的</test>
</book>
</books>`
//创建一个Books对象
bs := Books{}
//把xml数据解析成bs对象
xml.Unmarshal([]byte(data), &bs)
//打印bs对象
fmt.Printf("%+v \n",bs)
//循环打印Book
for _, v := range bs.Book {
fmt.Printf("%+v \n",v)
}
}
输出
{XMLName:{Space: Local:books} Nums:2 Book:[{XMLName:{Space: Local:book} Name:思想 Author:小张 Time:2018年1月20日 Types:[教育 历史] Test:我是多余的} {XMLName:{Space: Local:book} Name:政治 Author:小王 Time:2018年1月20日 Types:[科学 人文] Test:我是多余的}]}
{XMLName:{Space: Local:book} Name:思想 Author:小张 Time:2018年1月20日 Types:[教育 历史] Test:我是多余的}
{XMLName:{Space: Local:book} Name:政治 Author:小王 Time:2018年1月20日 Types:[科学 人文] Test:我是多余的}
通过结构体封装XMLDemo
package main
import (
"encoding/xml"
"fmt"
)
type Books struct {
XMLName xml.Name `xml:"books"`
Nums int `xml:"nums,attr"`
Book []Book `xml:"book"`
}
type Book struct {
XMLName xml.Name `xml:"book"`
Name string `xml:"name,attr"`
Author string `xml:"author"`
Time string `xml:"time"`
}
func main() {
bs := Books{Nums: 2}
//通过append添加book数据
bs.Book = append(bs.Book, Book{Name: "小红", Author: "阿三", Time: "2018年6月3日"})
bs.Book = append(bs.Book, Book{Name: "小绿", Author: "阿四", Time: "2018年6月5日"})
//通过MarshalIndent,让xml数据输出好看点
data, _ := xml.MarshalIndent(&bs, "", " ")
fmt.Println(string(data))
}
输出
<books nums="2">
<book name="小红">
<author>阿三</author>
<time>2018年6月3日</time>
</book>
<book name="小绿">
<author>阿四</author>
<time>2018年6月5日</time>
</book>
</books>