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<







