對應 default.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<config>
<smtpServer>smtp.163.com</smtpServer>
<smtpPort>25</smtpPort>
<sender>user@163.com</sender>
<senderPasswd>123456</senderPasswd>
<receivers flag="true">
<user>Mike_Zhang@live.com</user>
<user>test1@qq.com</user>
</receivers>
</config>
范例1:golang代碼:
package main
import (
"encoding/xml"
"fmt"
"io/ioutil"
"os"
)
type SConfig struct {
XMLName xml.Name `xml:"config"` // 指定最外層的標簽為config
SmtpServer string `xml:"smtpServer"` // 讀取smtpServer配置項,並將結果保存到SmtpServer變量中
SmtpPort int `xml:"smtpPort"`
Sender string `xml:"sender"`
SenderPasswd string `xml:"senderPasswd"`
Receivers SReceivers `xml:"receivers"` // 讀取receivers標簽下的內容,以結構方式獲取
}
type SReceivers struct {
Flag string `xml:"flag,attr"` // 讀取flag屬性
User []string `xml:"user"` // 讀取user數組
}
func main() {
file, err := os.Open("default.xml") // For read access.
if err != nil {
fmt.Printf("error: %v", err)
return
}
defer file.Close()
data, err := ioutil.ReadAll(file)
if err != nil {
fmt.Printf("error: %v", err)
return
}
v := SConfig{}
err = xml.Unmarshal(data, &v)
if err != nil {
fmt.Printf("error: %v", err)
return
}
fmt.Println(v)
fmt.Println("SmtpServer : ", v.SmtpServer)
fmt.Println("SmtpPort : ", v.SmtpPort)
fmt.Println("Sender : ", v.Sender)
fmt.Println("SenderPasswd : ", v.SenderPasswd)
fmt.Println("Receivers.Flag : ", v.Receivers.Flag)
for i, element := range v.Receivers.User {
fmt.Println(i, element)
}
}
輸出:
{{ config} smtp.163.com 25 user@163.com 123456 {true [Mike_Zhang@live.com test1@qq.com]}}
SmtpServer : smtp.163.com
SmtpPort : 25
Sender : user@163.com
SenderPasswd : 123456
Receivers.Flag : true
0 Mike_Zhang@live.com
1 test1@qq.com
范例2:
要讀取的XML如下:
<?xml version="1.0" encoding="UTF-8"?> <resources> <string name="VideoLoading">Loading video…</string> <string name="ApplicationName">what</string> </resources>
這種結構的XML,其末節點是屬性與文本並存的
根據這個XML,生成對應的struct
type StringResources struct {
XMLName xml.Name `xml:"resources"`
ResourceString []ResourceString `xml:"string"`
}
type ResourceString struct {
XMLName xml.Name `xml:"string"`
StringName string `xml:"name,attr"`
InnerText string `xml:",innerxml"`
}
內部屬性都要大寫字母開頭,屬性節點的名稱變量名固定為XMLName,內部的文本統一叫innerxml)
以下為完整讀取此XML的代碼
package main
import (
"encoding/xml"
"io/ioutil"
"log"
)
type StringResources struct {
XMLName xml.Name `xml:"resources"`
ResourceString []ResourceString `xml:"string"`
}
type ResourceString struct {
XMLName xml.Name `xml:"string"`
StringName string `xml:"name,attr"`
InnerText string `xml:",innerxml"`
}
func main() {
content, err := ioutil.ReadFile("studygolang.xml")
if err != nil {
log.Fatal(err)
}
var result StringResources
err = xml.Unmarshal(content, &result)
if err != nil {
log.Fatal(err)
}
log.Println(result)
log.Println(result.ResourceString)
for _, o := range result.ResourceString {
log.Println(o.StringName + "===" + o.InnerText)
}
}
輸出結果:
2021/10/09 09:08:58 {{ resources} [{{ string} VideoLoading Loading video…} {{ string} ApplicationName what}]}
2021/10/09 09:08:59 [{{ string} VideoLoading Loading video…} {{ string} ApplicationName what}]
2021/10/09 09:08:59 VideoLoading===Loading video…
2021/10/09 09:08:59 ApplicationName===what
接下來對這個XMl中的屬性值為ApplicationName的文本內容進行修改,然后保存到文件里,代碼如下:
package main
import (
"encoding/xml"
"fmt"
"io/ioutil"
"log"
"os"
"strings"
)
type StringResources struct {
XMLName xml.Name `xml:"resources"`
ResourceString []ResourceString `xml:"string"`
}
type ResourceString struct {
XMLName xml.Name `xml:"string"`
StringName string `xml:"name,attr"`
InnerText string `xml:",innerxml"`
}
func main() {
content, err := ioutil.ReadFile("studygolang.xml")
if err != nil {
log.Fatal(err)
}
var result StringResources
err = xml.Unmarshal(content, &result)
if err != nil {
log.Fatal(err)
}
log.Println(result)
log.Println(result.ResourceString)
for i, line := range result.ResourceString {
log.Println(line.StringName + "===" + line.InnerText)
//修改ApplicationName節點的內部文本innerText
if strings.EqualFold(line.StringName, "ApplicationName") {
fmt.Println("change innerText")
//注意修改的不是line對象,而是直接使用result中的真實對象
result.ResourceString[i].InnerText = "這是新的ApplicationName"
}
}
//保存修改后的內容
xmlOutPut, outPutErr := xml.MarshalIndent(result, "", "")
if outPutErr == nil {
//加入XML頭
headerBytes := []byte(xml.Header)
//拼接XML頭和實際XML內容
xmlOutPutData := append(headerBytes, xmlOutPut...)
//寫入文件
ioutil.WriteFile("studygolang_test.xml", xmlOutPutData, os.ModeAppend)
fmt.Println("OK~")
} else {
fmt.Println(outPutErr)
}
}

生成的XML如下:
<?xml version="1.0" encoding="UTF-8"?> <resources> <string name="VideoLoading">Loading video…</string> <string name="ApplicationName">這是新的ApplicationName</string> </resources>
