亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Go語言實現(xiàn)對XML的讀取和修改

 更新時間:2023年12月19日 15:43:04   作者:畱?  
這篇文章主要為大家詳細介紹了Go語言實現(xiàn)對XML的讀取和修改的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

前言

很久沒有更新了,來水篇文章。這篇文章給大家介紹一下如何用Go來讀取XML和修改XML。XML我就不多介紹了,相信大家都使用過,不了解的可以看下百度百科。

處理XML我們暫時不需要借助第三方庫,使用Go標(biāo)準(zhǔn)庫encoding包下的xml即可完成,“encoding/xml”。

讀取XML

首先我們需要創(chuàng)建一個XML文件,模擬一個web平臺的信息,需要協(xié)議、IP、端口號、用戶名和密碼、頁面路徑等信息。命名為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ù)這個XML文件來編寫對應(yīng)的結(jié)構(gòu)體樹,需要注意的是我們需要在最上層的結(jié)構(gòu)體中使用xml.Name字段來聲明最外圍標(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"`
}

聲明號XML文件對應(yīng)的結(jié)構(gòu)體之后,我們對文件進行解析讀取。首先讀取整個文件,獲取到文件的字節(jié)數(shù)組,再通過xml包提供的Unmarshal方法進行反序列化。

由于是示例代碼,錯誤都沒有進行處理,選擇直接panic。需要注意的是文件路徑的問題,如果提示找不到文件,可以使用文件的絕對路徑,或者使用os.Getwd()獲取程序運行的當(dāng)前目錄,再將文件拷貝到當(dāng)前目錄中。以下是完整示例代碼。

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()
}

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文件中的某幾個字段,首先需要使用os.Open方法打開文件,拿到實現(xiàn)了i o.Reader接口的文件流,然后調(diào)用Decode方法反序列化數(shù)據(jù)。

使用賦值方法修改數(shù)據(jù),完成后通過xml.MarshalIndent方法來序列化XML數(shù)據(jù),并控制前綴和縮進。

最后再覆寫文件,完成修改操作。以下是示例代碼。

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后兩個參數(shù)用來控制前綴和縮進
	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ù)制粘貼后,添加一個xml文件,修改文件路徑后可直接運行

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后兩個參數(shù)用來控制前綴和縮進
	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語言實現(xiàn)對XML的讀取和修改的文章就介紹到這了,更多相關(guān)Go讀取和修改XML內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決go獲取文件md5值不正確的問題

    解決go獲取文件md5值不正確的問題

    本文主要介紹了解決go獲取文件md5值不正確的問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • Go語言開發(fā)保證并發(fā)安全實例詳解

    Go語言開發(fā)保證并發(fā)安全實例詳解

    這篇文章主要為大家介紹了Go語言開發(fā)保證并發(fā)安全實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Go?內(nèi)聯(lián)優(yōu)化讓程序員愛不釋手

    Go?內(nèi)聯(lián)優(yōu)化讓程序員愛不釋手

    這篇文章主要介紹了Go?內(nèi)聯(lián)優(yōu)化讓程序員愛不釋手,內(nèi)聯(lián)是在編譯過程中自動進行的一類基本優(yōu)化之一,文章圍繞主題展開更多詳細介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-06-06
  • Go interface接口聲明實現(xiàn)及作用詳解

    Go interface接口聲明實現(xiàn)及作用詳解

    這篇文章主要為大家介紹了Go interface接口聲明實現(xiàn)及作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Go依賴注入工具wire的具體使用

    Go依賴注入工具wire的具體使用

    本文主要介紹了Go依賴注入工具wire的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Golang對mongodb進行聚合查詢詳解

    Golang對mongodb進行聚合查詢詳解

    這篇文章主要為大家詳細介紹了Golang對mongodb進行聚合查詢的方法,文中的示例代碼講解詳細,對我們學(xué)習(xí)Golang有一點的幫助,需要的可以參考一下
    2023-02-02
  • golang中protobuf的使用詳解

    golang中protobuf的使用詳解

    protobuf是Google公司提出的一種輕便高效的結(jié)構(gòu)化數(shù)據(jù)存儲格式,常用于結(jié)構(gòu)化數(shù)據(jù)的序列化,具有語言無關(guān)、平臺無關(guān)、可擴展性特性,常用于通訊協(xié)議、服務(wù)端數(shù)據(jù)交換場景,下面我們就來看看golang中protobuf的具體使用吧
    2023-10-10
  • Go語言使用Json的方法實現(xiàn)

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

    本文主要介紹了Go語言使用Json的方法實現(xiàn)
    2024-05-05
  • Go語言method詳解

    Go語言method詳解

    這篇文章主要介紹了Go語言method詳解,本文總結(jié)了在使用method的時候重要注意幾點、指針作為receiver、method繼承等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • Go并發(fā)編程sync.Cond的具體使用

    Go并發(fā)編程sync.Cond的具體使用

    Go 標(biāo)準(zhǔn)庫提供 Cond 原語的目的是,為等待 / 通知場景下的并發(fā)問題提供支持,本文主要介紹了Go并發(fā)編程sync.Cond的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2022-05-05

最新評論