要素名が可変かつ複数だがその中の属性などはわかっている場合の Unmarshal の方法です。
具体的にはこんな感じ。
<NAMES>
<!-- 画面ごとの表示名のリスト。プログラムとしては、ProgramX、CustName、お名前や顧客名が欲しい情報 -->
<Program1 ID="CustName" Name="お名前" />
<Program2 ID="CustName" Name="顧客名" />
</NAMES>
それを処理するのが以下のコード。
type ItemNames struct {
Defs []Def `xml:",any"` // ★
}
type Def struct {
XMLName xml.Name
ID string `xml:"ID,attr"`
Name string `xml:"Name,attr"`
}
func hoge() error {
if _, err := os.Stat("itemNames.xml"); err == nil {
fd, err := os.Open("itemNames.xml")
if err != nil {
return err
}
content, err := ioutil.ReadAll(fd)
if err != nil {
return err
}
fd.Close()
var itemNames ItemNames
err = xml.Unmarshal(content, &itemNames)
if err != nil {
return err
}
for _, d := range itemNames.Defs {
// よしなに
// d.XMLName.Local
// d.ID
// d.Name
}
}