[英]How to get the number of items from a structure sub field using reflect in go
[英]How to get structure specified in XML with Go?
我有一個像這個測試一樣的 XML 文件test.xml
<metalib tagsetversion="1" name="TLog" version="1">
<struct name="STRUCT_1">
<entry name="ENTRY_1"/>
</struct>
<struct name="STRUCT_2">
<entry name="ENTRY_1"/>
<entry name="ENTRY_2"/>
</struct>
<!-- many structs -->
<union name="UNION" version="1">
<entry type="STRUCT_1" id="ID_STRUCT_1" />
<entry type="STRUCT_2" id="ID_STRUCT_2" />
</union>
</metalib>
我想將它解析為 go 結構,如下所示:
map["STRUCT_1"] == ["ENTRY_1"], map["STRUCT_2"] == ["ENTRY_1","ENTRY_2"]
和另一個 map:
map2["ID_STRUCT_1"] == "STRUCT_1", map2["ID_STRUCT_2"] == "STRUCT_2"
我曾嘗試使用github.com/clbanning/mxj/x2j
解決這個問題,我的代碼如下:
package main
import (
"encoding/json"
"os"
"fmt"
"testing"
"github.com/clbanning/mxj/x2j"
)
func TestXml2Map(t *testing.T) {
filePath := "test.xml"
fi, fierr := os.Stat(filePath)
if fierr != nil {
fmt.Println("fierr:", fierr.Error())
return
}
fh, fherr := os.Open(filePath)
if fherr != nil {
fmt.Println("fherr:", fherr.Error())
return
}
defer fh.Close()
buf := make([]byte, fi.Size())
_, nerr := fh.Read(buf)
if nerr != nil {
fmt.Println("nerr:", nerr.Error())
return
}
mmap, merr := x2j.XmlToMap(buf)
if merr != nil {
fmt.Println("merr:", merr.Error())
return
}
// fmt.Println("mmap:", mmap)
metalib := mmap["metalib"]
// fmt.Println("metalib:", metalib)
json.Unmarshal(buf, &metalib)
mapmetalib := metalib.(map[string]interface{})
// fmt.Println("mapmetalib struct: ", mapmetalib["struct"])
istruct := mapmetalib["struct"]
json.Unmarshal(buf, &istruct)
mapstruct := istruct.([]interface{})
fmt.Println("mapstruct: ", mapstruct)
}
但我很困惑,不知道下一步該怎么做。
package main
import (
"encoding/xml"
"fmt"
)
type entry struct {
Name string `xml:"name,attr"`
}
type Struct struct {
Name string `xml:"name,attr"`
Entry []entry `xml:"entry"`
}
type metalib struct {
XMLName xml.Name `xml:"metalib"`
Struct []Struct `xml:"struct"`
}
func main() {
datastr := []byte(`<metalib tagsetversion="1" name="TLog" version="1">
<struct name="STRUCT_1">
<entry name="ENTRY_1"/>
</struct>
<struct name="STRUCT_2">
<entry name="ENTRY_1"/>
<entry name="ENTRY_2"/>
</struct>
<!-- many structs -->
<union name="UNION" version="1">
<entry type="STRUCT_1" id="ID_STRUCT_1" />
<entry type="STRUCT_2" id="ID_STRUCT_2" />
</union>
</metalib>`)
metalib := metalib{}
err := xml.Unmarshal(datastr, &metalib)
if err != nil {
return
}
fmt.Printf("%v\n", metalib)
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.