4

给定一个类似于以下的 xml 块:

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

如何遍历<entry>文档中的每个元素并将其放入一个结构中以在移动到下一个条目之前对其执行一些操作?

如上所述,我已经能够将数据从 XML 块解析并存储到结构中,其中只有一个<entry>元素存在。也就是说,我成功地将这样的内容存储到结构中:

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

3 回答 3

10

解析一个 xmll 文件直到您到达入口元素是一种方法:

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 回答
0

只要确保你正确处理 EOF

for {
    // Read tokens from the XML document in a stream.
    t, err := decoder.Token()
    if t == nil {
        if err == nil {
            continue
        }
        if err == io.EOF {
            break
        }
        log.Fatal(err)
    }

    //...
}
于 2015-01-19T16:40:01.893 回答