golang學習筆記---xml 讀取


對應 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>

  

 

 

 

 

 
        

 

 

 

 

 

 

 

 

 

 
        
 
        


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM