golang encoding/xml 解析多個根節點的XML檔案
阿新 • • 發佈:2021-06-26
問題
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
還是有點噁心的,侵入了我的程式碼結構.