Go言語 – 17.XMLのパース ②
XMLの生成
XMLのパース ① で作成した構造体を元に、今回はパースとは逆に構造体を元にしてXMLを生成します。
生成
前回のパースの結果です。
前回のパースにより、dataにはこのように要素の値が取得できました。
data.Families[0].Lastname "山田" data.Families[0].Members[0].Firstname "太郎" data.Families[0].Members[0].Mail "taro.yamada@aaa.bbb.cc" data.Families[0].Members[1].Firstname "花子" data.Families[0].Members[1].Mail "hanako.yamada@aaa.bbb.cc" data.Families[1].Lastname "花形" data.Families[1].Members[0].Firstname "みつる" data.Families[1].Members[0].Mail "mitsuru.hanagata@aaa.bbb.cc" data.Families[1].Members[1].Firstname "かほる" data.Families[1].Members[1].Mail "kahoru.hanagata@aaa.bbb.cc"
前回と同じですが構造体です。
type Data struct { Families []Family `xml:"family"` } type Family struct { Lastname string `xml:"lastname,attr"` Members []Members `xml:"member"` } type Members struct { Firstname string `xml:"firstname"` Mail string `xml:"mail"` }
XML生成部分です。
MarshalIndentにて「data」を元にして「xmlOut」にXMLを生成します。
// XML生成 xmlOut, err := xml.MarshalIndent(&data, "", " ") if err != nil { fmt.Println("XML Marshal error:", err) return }
表示箇所です。
// 生成できたXMLを表示 fmt.Println(string(xmlOut))
今回のソース全体です。
前回のソースの最後の方に、XML生成部分と表示箇所を追記しているだけのソースです。
package main import ( "encoding/xml" "fmt" ) type Data struct { Families []Family `xml:"family"` } type Family struct { Lastname string `xml:"lastname,attr"` Members []Members `xml:"member"` } type Members struct { Firstname string `xml:"firstname"` Mail string `xml:"mail"` } func main() { xmlStr := ` <?xml version="1.0" encoding="UTF-8"?> <data> <family lastname="山田"> <member> <firstname>太郎</firstname> <mail>taro.yamada@aaa.bbb.cc</mail> </member> <member> <firstname>花子</firstname> <mail>hanako.yamada@aaa.bbb.cc</mail> </member> </family> <family lastname="花形"> <member> <firstname>みつる</firstname> <mail>mitsuru.hanagata@aaa.bbb.cc</mail> </member> <member> <firstname>かほる</firstname> <mail>kahoru.hanagata@aaa.bbb.cc</mail> </member> </family> </data> ` data := new(Data) if err := xml.Unmarshal([]byte(xmlStr), data); err != nil { fmt.Println("XML Unmarshal error:", err) return } // 家族1 fmt.Println(data.Families[0].Lastname) // 苗字 fmt.Println(data.Families[0].Members[0].Firstname) // 名前1 fmt.Println(data.Families[0].Members[0].Mail) // メールアドレス1 fmt.Println(data.Families[0].Members[1].Firstname) // 名前2 fmt.Println(data.Families[0].Members[1].Mail) // メールアドレス2 // 区切り fmt.Println("") // 家族2 fmt.Println(data.Families[1].Lastname) // 苗字 fmt.Println(data.Families[1].Members[0].Firstname) // 名前1 fmt.Println(data.Families[1].Members[0].Mail) // メールアドレス1 fmt.Println(data.Families[1].Members[1].Firstname) // 名前2 fmt.Println(data.Families[1].Members[1].Mail) // メールアドレス2 // 区切り fmt.Println("") // XML生成 xmlOut, err := xml.MarshalIndent(&data, "", " ") if err != nil { fmt.Println("XML Marshal error:", err) return } // 生成できたXMLを表示 fmt.Println(string(xmlOut)) }
実行結果
山田 太郎 tao.yamada@aaa.bbb.cc 花子 hanako.yamada@aaa.bbb.cc 花形 みつる mitsuru.hanagata@aaa.bbb.cc かほる kahoru.hanagata@aaa.bbb.cc <Data> <family lastname="山田"> <member> <firstname>太郎</firstname> <mail>taro.yamada@aaa.bbb.cc</mail> </member> <member> <firstname>花子</firstname> <mail>hanako.yamada@aaa.bbb.cc</mail> </member> </family> <family lastname="花形"> <member> <firstname>みつる</firstname> <mail>mitsuru.hanagata@aaa.bbb.cc</mail> </member> <member> <firstname>かほる</firstname> <mail>kahoru.hanagata@aaa.bbb.cc</mail> </member> </family> </Data>