作者:魔蝎陈小琳 | 来源:互联网 | 2023-05-19 02:18
要读取的XML如下:
Loading video…
what
这种结构的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)
}
}
输出结果如图:
接下来对这个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如下:
Loading video…
这是新的ApplicationName
更复杂的XML结构,这里就不多讲了。主要是struct的结构会复杂点。