Go言語 – 16.XMLのパース ①
XMLのパース ①
XML形式を扱うには、encoding/xmlパッケージを使用します。
目次
パース
下記のようなxmlをパースすることで、xmlから名前とメールアドレスを取り出してみましょう。
str := ` <?xml version="1.0" encoding="UTF-8"?> <data> <family lastname="山田"> <member> <firstname>太郎</firstname> <mail>tao.yamada@aaa.bbb.cc</mail> <member> <member> <firstname>花子</firstname> <mail>hanako.yamada@aaa.bbb.cc</mail> <member> </family> <family lastname="花形"> <member> <firstname>みつる</firstname> <mail>tao.yamada@aaa.bbb.cc</mail> <member> <member> <firstname>かほる</firstname> <mail>hanako.yamada@aaa.bbb.cc</mail> <member> </family> </data> `
xmlに合わせて、構造体を定義します。
type Data struct { Families []Family `xml:"family"` } type Family struct { Lastname string `xml:"lastname,attr"` Members string `xml:"member"` } type Members struct { Firstname string `xml:"firstname"` Mail string `xml:"mail"` }
Unmarshal関数でXML文字列を構造体に納めます。
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
ソース全体です。
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>tao.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 }
実行結果
山田 太郎 tao.yamada@aaa.bbb.cc 花子 hanako.yamada@aaa.bbb.cc 花形 みつる mitsuru.hanagata@aaa.bbb.cc かほる kahoru.hanagata@aaa.bbb.cc<