最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語(yǔ)言實(shí)現(xiàn)對(duì)XML的讀取和修改

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

前言

很久沒(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)、用戶(hù)名和密碼、頁(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)編寫(xiě)對(duì)應(yīng)的結(jié)構(gòu)體樹(shù),需要注意的是我們需要在最上層的結(jié)構(gòu)體中使用xml.Name字段來(lái)聲明最外圍標(biāo)簽的名稱(chēng)。

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方法打開(kāi)文件,拿到實(shí)現(xiàn)了i o.Reader接口的文件流,然后調(diào)用Decode方法反序列化數(shù)據(jù)。

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

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

func amendXML() {
	file, err := os.Open(XMLFilePath)
	if err != nil {
		log.Fatalf("打開(kāi)文件%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)
	}

	// 覆寫(xiě)文件
	xmlData = append([]byte(xml.Header), xmlData...)
	if err = os.WriteFile(XMLFilePath, xmlData, 0777); err != nil {
		log.Fatal("覆寫(xiě)文件失敗:",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("打開(kāi)文件%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)
	}

	// 覆寫(xiě)文件
	xmlData = append([]byte(xml.Header), xmlData...)
	if err = os.WriteFile(XMLFilePath, xmlData, 0777); err != nil {
		log.Fatal("覆寫(xiě)文件失敗:",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)文章

  • 用golang實(shí)現(xiàn)一個(gè)定時(shí)器任務(wù)隊(duì)列實(shí)例

    用golang實(shí)現(xiàn)一個(gè)定時(shí)器任務(wù)隊(duì)列實(shí)例

    golang中提供了2種定時(shí)器timer和ticker,分別是一次性定時(shí)器和重復(fù)任務(wù)定時(shí)器。這篇文章主要介紹了用golang實(shí)現(xiàn)一個(gè)定時(shí)器任務(wù)隊(duì)列實(shí)例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2018-05-05
  • 解決GO編譯時(shí)避免引入外部動(dòng)態(tài)庫(kù)的問(wèn)題

    解決GO編譯時(shí)避免引入外部動(dòng)態(tài)庫(kù)的問(wèn)題

    最近碰到一個(gè)問(wèn)題,有一個(gè)流量采集的組件中使用到了github.com/google/gopacket 這個(gè)庫(kù),這個(gè)庫(kù)使用一切正常,但是唯獨(dú)有一個(gè)缺點(diǎn),編譯后的二進(jìn)制文件依賴(lài)于libpcap.so的動(dòng)態(tài)庫(kù),這篇文章主要介紹了GO編譯時(shí)避免引入外部動(dòng)態(tài)庫(kù)的解決方法,需要的朋友可以參考下
    2022-10-10
  • GO常見(jiàn)的錯(cuò)誤99%程序員會(huì)遇到(解決方法)

    GO常見(jiàn)的錯(cuò)誤99%程序員會(huì)遇到(解決方法)

    這篇文章主要介紹了GO常見(jiàn)的錯(cuò)誤99%程序員會(huì)遇到,本文給出了解決方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Go語(yǔ)言中如何進(jìn)行數(shù)據(jù)庫(kù)查詢(xún)操作

    Go語(yǔ)言中如何進(jìn)行數(shù)據(jù)庫(kù)查詢(xún)操作

    在Go語(yǔ)言中,與數(shù)據(jù)庫(kù)交互通常通過(guò)使用數(shù)據(jù)庫(kù)驅(qū)動(dòng)來(lái)實(shí)現(xiàn),Go語(yǔ)言支持多種數(shù)據(jù)庫(kù),如MySQL、PostgreSQL、SQLite等,每種數(shù)據(jù)庫(kù)都有其對(duì)應(yīng)的官方或第三方驅(qū)動(dòng),接下來(lái)通過(guò)本文給大家介紹Go語(yǔ)言中進(jìn)行數(shù)據(jù)庫(kù)查詢(xún)操作方法,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • Go語(yǔ)言單元測(cè)試超詳細(xì)解析

    Go語(yǔ)言單元測(cè)試超詳細(xì)解析

    本文介紹了了Go語(yǔ)言單元測(cè)試超詳細(xì)解析,測(cè)試函數(shù)分為函數(shù)的基本測(cè)試、函數(shù)的組測(cè)試、函數(shù)的子測(cè)試,進(jìn)行基準(zhǔn)測(cè)試時(shí)往往是對(duì)函數(shù)的算法進(jìn)行測(cè)驗(yàn),有時(shí)后一個(gè)算法在測(cè)試數(shù)據(jù)的基量不同時(shí)測(cè)試出的效果會(huì)不同我們需要對(duì)不同數(shù)量級(jí)的樣本進(jìn)行測(cè)試,下文需要的朋友可以參考下
    2022-02-02
  • golang模板template自定義函數(shù)用法示例

    golang模板template自定義函數(shù)用法示例

    這篇文章主要介紹了golang模板template自定義函數(shù)用法,結(jié)合實(shí)例形式分析了Go語(yǔ)言模板自定義函數(shù)的基本定義與使用方法,需要的朋友可以參考下
    2016-07-07
  • 使用go連接clickhouse方式

    使用go連接clickhouse方式

    這篇文章主要介紹了使用go連接clickhouse方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • Go語(yǔ)言中普通函數(shù)與方法的區(qū)別分析

    Go語(yǔ)言中普通函數(shù)與方法的區(qū)別分析

    這篇文章主要介紹了Go語(yǔ)言中普通函數(shù)與方法的區(qū)別,以實(shí)例形式對(duì)比分析了普通函數(shù)與方法使用時(shí)的區(qū)別與相關(guān)技巧,需要的朋友可以參考下
    2015-02-02
  • Golang超全面講解并發(fā)

    Golang超全面講解并發(fā)

    goroutine?不是os線程、不是綠色線程(由語(yǔ)言運(yùn)行時(shí)管理的線程),是協(xié)程。協(xié)程是一種非搶占式的簡(jiǎn)單并發(fā)子goroutine(函數(shù)、閉包或方法),也就是說(shuō),它們不能被中斷。取而代之的是,協(xié)程有多個(gè)點(diǎn),允許暫?;蛑匦逻M(jìn)入?—Go語(yǔ)言并發(fā)之道
    2022-06-06
  • Golang性能優(yōu)化的技巧分享

    Golang性能優(yōu)化的技巧分享

    性能優(yōu)化的前提是滿(mǎn)足正確可靠、簡(jiǎn)潔清晰等質(zhì)量因素,針對(duì)?Go語(yǔ)言特性,本文為大家整理了一些Go語(yǔ)言相關(guān)的性能優(yōu)化建議,感興趣的可以了解一下
    2023-07-07

最新評(píng)論

离岛区| 澄城县| 玛纳斯县| 攀枝花市| 恭城| 泰兴市| 万安县| 大理市| 宜川县| 杭州市| 福泉市| 武功县| 五寨县| 翁牛特旗| 安远县| 酒泉市| 黄骅市| 灌南县| 芮城县| 永春县| 额尔古纳市| 和平县| 广水市| 奉新县| 苗栗县| 南江县| 锦州市| 阳春市| 麦盖提县| 昆明市| 建湖县| 汕尾市| 大厂| 信阳市| 襄垣县| 阜南县| 嵩明县| 故城县| 宝丰县| 兴义市| 永昌县|