Go語(yǔ)言實(shí)現(xiàn)對(duì)XML的讀取和修改
前言
很久沒(méi)有更新了,來(lái)水篇文章。這篇文章給大家介紹一下如何用Go來(lái)讀取XML和修改XML。XML我就不多介紹了,相信大家都使用過(guò),不了解的可以看下百度百科。
處理XML我們暫時(shí)不需要借助第三方庫(kù),使用Go標(biāo)準(zhǔn)庫(kù)encoding包下的xml即可完成,“encoding/xml”。
讀取XML
首先我們需要?jiǎng)?chuàng)建一個(gè)XML文件,模擬一個(gè)web平臺(tái)的信息,需要協(xié)議、IP、端口號(hào)、用戶名和密碼、頁(yè)面路徑等信息。命名為web.xml.
<?xml version="1.0" encoding="UTF-8"?> <Web> <Protocol>https</Protocol> <Host>192.168.100.169</Host> <Port>8080</Port> <Account> <Username>admin</Username> <Password>123456</Password> </Account> <Link> <Login>/api/login</Login> <Index>/api/index/page</Index> <Setting>/api/self/setting</Setting> </Link> </Web>
緊接著根據(jù)這個(gè)XML文件來(lái)編寫對(duì)應(yīng)的結(jié)構(gòu)體樹,需要注意的是我們需要在最上層的結(jié)構(gòu)體中使用xml.Name字段來(lái)聲明最外圍標(biāo)簽的名稱。
type WebContent struct { XML xml.Name `json:"Web" xml:"Web"` Protocol string `json:"protocol"` Host string `json:"host"` Port string `json:"port"` Account *Account `json:"account"` Link *Link `json:"link"` } type Account struct { Username string `json:"username"` Password string `json:"password"` } type Link struct { Login string `json:"login"` Index string `json:"index"` Setting string `json:"setting"` }
聲明號(hào)XML文件對(duì)應(yīng)的結(jié)構(gòu)體之后,我們對(duì)文件進(jìn)行解析讀取。首先讀取整個(gè)文件,獲取到文件的字節(jié)數(shù)組,再通過(guò)xml包提供的Unmarshal方法進(jìn)行反序列化。
由于是示例代碼,錯(cuò)誤都沒(méi)有進(jìn)行處理,選擇直接panic。需要注意的是文件路徑的問(wèn)題,如果提示找不到文件,可以使用文件的絕對(duì)路徑,或者使用os.Getwd()獲取程序運(yùn)行的當(dāng)前目錄,再將文件拷貝到當(dāng)前目錄中。以下是完整示例代碼。
package main import ( "encoding/xml" "fmt" "log" "os" ) // 這里我使用的是絕對(duì)路徑 const ( XMLFilePath = "/Users/mac/Library/Application Support/JetBrains/GoLand2023.3/scratches/web.xml" ) type WebContent struct { XMLName xml.Name `json:"Web" xml:"Web"` Protocol string `json:"protocol"` Host string `json:"host"` Port string `json:"port"` Account *Account `json:"account"` Link *Link `json:"link"` } type Account struct { Username string `json:"username"` Password string `json:"password"` } type Link struct { Login string `json:"login"` Index string `json:"index"` Setting string `json:"setting"` } func main() { readXMl() } func readXMl() { data, err := os.ReadFile(XMLFilePath) if err != nil { log.Fatalf("讀取文件%v失敗: %v\n", XMLFilePath, err) } w := new(WebContent) if err = xml.Unmarshal(data, &w); err != nil { log.Fatal("XML數(shù)據(jù)解析失敗", err) } fmt.Println("------------------------------") fmt.Printf("Protocol: %v\nHost: %v\nPort: %v\nAccount:\n --Username: %v\n --Password: %v\nLink:\n --Login: %v\n --Index: %v\n --Setting: %v\n", w.Protocol, w.Host, w.Port, w.Account.Username, w.Account.Password, w.Link.Login, w.Link.Index,w.Link.Setting) fmt.Println("------------------------------") } /* 輸出信息: ------------------------------ Protocol: http Host: 192.168.100.169 Port: 80 Account: --Username: sysadmin --Password: sysadmin Link: --Login: /api/login --Index: /api/index/page --Setting: /api/self/setting ------------------------------ */
修改XML
修改XML文件中的某幾個(gè)字段,首先需要使用os.Open方法打開文件,拿到實(shí)現(xiàn)了i o.Reader接口的文件流,然后調(diào)用Decode方法反序列化數(shù)據(jù)。
使用賦值方法修改數(shù)據(jù),完成后通過(guò)xml.MarshalIndent方法來(lái)序列化XML數(shù)據(jù),并控制前綴和縮進(jìn)。
最后再覆寫文件,完成修改操作。以下是示例代碼。
func amendXML() { file, err := os.Open(XMLFilePath) if err != nil { log.Fatalf("打開文件%v失敗: %v\n", XMLFilePath, err) } // 解析文件 w := new(WebContent) if err = xml.NewDecoder(file).Decode(&w); err != nil { log.Fatal("解析文件失敗:", err) } // 修改數(shù)據(jù) w.Protocol= "http" w.Account.Password = "123456" // 序列化XML數(shù)據(jù),MarshalIndent后兩個(gè)參數(shù)用來(lái)控制前綴和縮進(jìn) xmlData, err := xml.MarshalIndent(w, "", " ") if err != nil { log.Fatal(err) } // 覆寫文件 xmlData = append([]byte(xml.Header), xmlData...) if err = os.WriteFile(XMLFilePath, xmlData, 0777); err != nil { log.Fatal("覆寫文件失敗:",err) } }
完整代碼
以下是完整的代碼,復(fù)制粘貼后,添加一個(gè)xml文件,修改文件路徑后可直接運(yùn)行
package main import ( "encoding/xml" "fmt" "log" "os" ) const ( XMLFilePath = "/Users/mac/Library/Application Support/JetBrains/GoLand2023.3/scratches/web.xml" ) type WebContent struct { XMLName xml.Name `json:"Web" xml:"Web"` Protocol string `json:"protocol"` Host string `json:"host"` Port string `json:"port"` Account *Account `json:"account"` Link *Link `json:"link"` } type Account struct { Username string `json:"username"` Password string `json:"password"` } type Link struct { Login string `json:"login"` Index string `json:"index"` Setting string `json:"setting"` } func main() { readXML() amendXML() readXML() } func readXML() { data, err := os.ReadFile(XMLFilePath) if err != nil { log.Fatalf("讀取文件%v失敗: %v\n", XMLFilePath, err) } w := new(WebContent) if err = xml.Unmarshal(data, &w); err != nil { log.Fatal("XML數(shù)據(jù)解析失敗", err) } fmt.Println("------------------------------") fmt.Printf("Protocol: %v\nHost: %v\nPort: %v\nAccount:\n --Username: %v\n --Password: %v\nLink:\n --Login: %v\n --Index: %v\n --Setting: %v\n", w.Protocol, w.Host, w.Port, w.Account.Username, w.Account.Password, w.Link.Login, w.Link.Index,w.Link.Setting) fmt.Println("------------------------------") } func amendXML() { file, err := os.Open(XMLFilePath) if err != nil { log.Fatalf("打開文件%v失敗: %v\n", XMLFilePath, err) } // 解析文件 w := new(WebContent) if err = xml.NewDecoder(file).Decode(&w); err != nil { log.Fatal("解析文件失敗:", err) } // 修改數(shù)據(jù) w.Protocol= "http" w.Account.Password = "654321" // 序列化XML數(shù)據(jù),MarshalIndent后兩個(gè)參數(shù)用來(lái)控制前綴和縮進(jìn) xmlData, err := xml.MarshalIndent(w, "", " ") if err != nil { log.Fatal(err) } // 覆寫文件 xmlData = append([]byte(xml.Header), xmlData...) if err = os.WriteFile(XMLFilePath, xmlData, 0777); err != nil { log.Fatal("覆寫文件失敗:",err) } }
執(zhí)行輸出
------------------------------
Protocol: https
Host: 192.168.100.169
Port: 80
Account:
--Username: admin
--Password: 123456
Link:
--Login: /api/login
--Index: /api/index/page
--Setting: /api/self/setting
------------------------------
------------------------------
Protocol: http
Host: 192.168.100.169
Port: 80
Account:
--Username: admin
--Password: 654321
Link:
--Login: /api/login
--Index: /api/index/page
--Setting: /api/self/setting
------------------------------
到此這篇關(guān)于Go語(yǔ)言實(shí)現(xiàn)對(duì)XML的讀取和修改的文章就介紹到這了,更多相關(guān)Go讀取和修改XML內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語(yǔ)言開發(fā)保證并發(fā)安全實(shí)例詳解
這篇文章主要為大家介紹了Go語(yǔ)言開發(fā)保證并發(fā)安全實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Go?內(nèi)聯(lián)優(yōu)化讓程序員愛不釋手
這篇文章主要介紹了Go?內(nèi)聯(lián)優(yōu)化讓程序員愛不釋手,內(nèi)聯(lián)是在編譯過(guò)程中自動(dòng)進(jìn)行的一類基本優(yōu)化之一,文章圍繞主題展開更多詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06Go interface接口聲明實(shí)現(xiàn)及作用詳解
這篇文章主要為大家介紹了Go interface接口聲明實(shí)現(xiàn)及作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03

Go語(yǔ)言使用Json的方法實(shí)現(xiàn)