1. 程式人生 > 其它 >golang encoding/xml 解析多個根節點的XML檔案

golang encoding/xml 解析多個根節點的XML檔案

問題

xml檔案格式如下:

<?xml version="1.0" encoding="utf-8"?>
<meta><version>1924</version></meta>
<record><manifest>
<file><name>res\atlas\.rec</name><version>resn/v1921</version><md5>09080959b6fee8071eeb7c7c760da5ba</md5></file>
<file><name>res\atlas\comp.atlas</name><version>resn/v1234</version><md5>a6e0254c076318fd4cbd6140ca64f2b0</md5></file>
<file><name>res\atlas\comp.png</name><version>resn/v1</version><md5>c1990d9110d0cf21ed9404e671577fed</md5></file>
</manifest></record>

寫了一下 encoding/xml 的程式碼發現,貌似只能獲取一個根節點,否則會報錯:

expected element type <record> but have <meta>

曲線救國 <解決方案> 解析多個根節點的xml檔案

既然你不讓我解析多個根節點, 那我就修改xml檔案,讓其只有一個根節點. 我讀取xml文字內容到 bf22 []byte 裡面,然後去掉頭,在包裹上我的 document即可:

	changed := string(bf22)
	changed = strings.ReplaceAll(changed, "<?xml version=\"1.0\" encoding=\"utf-8\"?>", "")
	changed = "<document>" + changed + "</document>"

最終定義的Xml go結構為:

	type MetaVersion struct {
		//XMLName xml.Name `xml:"meta"`
		Version int      `xml:"version"`
	}
	type FileVDetail struct {
		//XMLName xml.Name `xml:"file"`
		Name    string `xml:"name"`
		Version string `xml:"version"`
		Md5     string `xml:"md5"`
	}
	type RecordType struct {
		XMLName xml.Name `xml:"document"`
		//<meta><version>1924</version></meta>
		Meta MetaVersion `xml:"meta"`

		//<record><manifest>
		//<file><name>res\atlas\.rec</name><version>resn/v1921</version><md5>09080959b6fee8071eeb7c7c760da5ba</md5></file>
		Files []FileVDetail `xml:"record>manifest>file"`
	}

不得不說 , 這個 XMLName xml.Name 還是有點噁心的,侵入了我的程式碼結構.