读取xml
想要读取xml文件中的相关信息,xml如下图所示:
<azkaban-users>
<user groups="azkaban" password="azkabanqweqe" roles="admin" username="azkaban">The demouser>
azkaban-users>
对应xml中内容编写结构体
//xml文件中节点
type StrResources struct {
XMLName xml.Name `xml:"azkaban-users"`//标签名称
Users []User `xml:"user"` //标签名称
}
type User struct {
XMLName xml.Name `xml:"user"` //标签名称
UserName string `xml:"username,attr"` //属性
Roles string `xml:"roles,attr"`
Password string `xml:"password,attr"`
Groups string `xml:"groups,attr"`
InnerText string `xml:",innerxml"` //内部的文本
}
标签使用介绍:
“-“:不会输出
“name,attr”:以name作为属性名
“,attr”:以这个struct的字段名作为属性名输出为XML元素的属性
“,chardata”:输出为xml的 character data而非element
“,innerxml”:被原样输出
“,comment”:将被当作xml注释来输出,字段值中不能含有”–”字符串
“omitempty”:如果该字段的值为空值那么该字段就不会被输出到XML,空值包括:false、0、nil指针或nil接口,任何长度为0的array, slice, map或者string
main方法中进行读取操作
1.读取xml文件位置
2.将文件转为对象
3.遍历读取
func main(){
//获取xml文件位置
content, err := ioutil.ReadFile("C:\\Users\\caoyujiao-ds\\Desktop\\test2.xml")
if err != nil {
fmt.Println("读文件位置错误信息:",err)
}
//将文件转换为对象
var result StrResources
err = xml.Unmarshal(content, &result)
if err != nil {
fmt.Println("读文件内容错误信息:",err)
}
fmt.Println("result:",result)
fmt.Println("result.ResourceString:",result.Users)
for _,o :=range result.Users{
log.Println("UserName:",o.XMLName)
log.Println("UserName:",o.UserName)
log.Println("Roles:",o.Roles)
log.Println("Password:",o.Password)
log.Println("Groups:",o.Groups)
log.Println("InnerText:",o.InnerText)
}
fmt.Println("读取完成。。。。")
}
效果如下:
写入xml
过程与写入是相逆的
1.把字符串转对象
2.遍历拼接
3.输出xml格式
4.保存文件至指定位置
func main() {
var text =` `
pars := &StrRes{}
xml.Unmarshal([]byte(text), &pars)//将字符串转为对象
fmt.Println(pars)
v := &StrRes{Name: "helloWorld"}
for cp:=0;cp<3;cp++ {
var user UserA
user.UserName="UserName"
user.Password="Password"
user.Groups=strconv.Itoa(cp)
user.InnerText="123"
v.Users=append(v.Users,user)
}
//输出打印格式
xmlOutPut, outPutErr := xml.MarshalIndent(v, " ", " ")
if outPutErr!=nil {
fmt.Println("error:",outPutErr)
}
fmt.Println(string(xmlOutPut))
//保存文件
if outPutErr == nil {
headerBytes := []byte(xml.Header)//加入XML头
xmlOutPutData := append(headerBytes, xmlOutPut...)//拼接XML头和实际XML内容
//写入文件
ioutil.WriteFile("C:\\Users\\caoyujiao-ds\\Desktop\\test4.xml", xmlOutPutData, os.ModeAppend)
fmt.Println("输出完成。。。。")
} else {
fmt.Println(outPutErr)
}
}
显示如下图: