4

次のような xml ブロッ​​クがあるとします。

<data>
  <entry>
    ... several nested elements
  </entry>
  <entry>
    ... more nested elements
  </entry>
</data>

次のエントリに移動する前に、ドキュメント内の各要素を繰り返し処理し<entry>、それを構造体に入れていくつかの操作を実行するにはどうすればよいですか?

<entry>上記のように、要素が1 つしか存在しない XML のブロックから、データを解析して構造体に格納することができます。つまり、次のようなものを構造体に正常に格納できます。

<entry>
  ... several nested elements
</entry>
4

3 に答える 3

10

エントリ要素に到達するまで xml ファイルを解析するのが 1 つの方法です。

xmlFile, err := os.Open(filename)
    if err != nil {
    log.Fatal(err)
}
defer xmlFile.Close()
decoder := xml.NewDecoder(xmlFile)
total := 0
for {
    token, _ := decoder.Token()
    if token == nil {
        break
    }
    switch startElement := token.(type) {
        case xml.StartElement:
        if startElement.Name.Local == "entry" {
            // do what you need to do for each entry below
        }
    }
}
于 2012-08-23T04:20:50.017 に答える
7

http://golang.org/pkg/encoding/xml/のドキュメントと例に従って、これを行う方法は次のとおりです。

package main

import (
    "encoding/xml"
    "log"
)

// Represents a <data> element
type Data struct {
    XMLName xml.Name `xml:"data"`
    Entry   []Entry  `xml:"entry"`
}

// Represents an <entry> element
type Entry struct {
    Name string `xml:"name"`
    Age  int    `xml:"age"`
}

// Test data
var testXML string = `
<data>
    <entry>
        <name>John Doe</name>
        <age>28</age>
    </entry>
    <entry>
        <name>Jane Doe</name>
        <age>29</age>
    </entry>
    <entry>
        <name>Bob Doe</name>
        <age>30</age>
    </entry>
    <entry>
        <name>Beth Doe</name>
        <age>31</age>
    </entry>
</data>
`

func main() {

    data := &Data{}

    err := xml.Unmarshal([]byte(testXML), data)
    if err != nil {
        log.Fatal(err)
    }

    for i := 0; i < len(data.Entry); i++ {
        log.Printf("%#v", data.Entry[i])
    }
}

出力は次のとおりです。

main.Entry{Name:"John Doe", Age:28}
main.Entry{Name:"Jane Doe", Age:29}
main.Entry{Name:"Bob Doe", Age:30}
main.Entry{Name:"Beth Doe", Age:31}
于 2012-08-25T06:41:07.453 に答える