Go言語 – 16.XMLのパース ①

2019-03-01Go言語

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<

 

株式会社システムトラスト

人材募集中です。

システムトラストでは、システムエンジニア、プログラマーなどを随時募集中です。気軽にご相談ください。

お問合せ