Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在go中遍历xml_Xml_Struct_Go_Xml Parsing - Fatal编程技术网

在go中遍历xml

在go中遍历xml,xml,struct,go,xml-parsing,Xml,Struct,Go,Xml Parsing,给定一个类似于以下内容的xml块: <data> <entry> ... several nested elements </entry> <entry> ... more nested elements </entry> </data> ... 几个嵌套元素 ... 更多嵌套元素 如何迭代文档中的每个元素,并将其放入结构中,以便在移动到下一个条目之前对其执行一些操作 我已经能够从上面的

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

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

... 几个嵌套元素
... 更多嵌套元素
如何迭代文档中的每个
元素,并将其放入结构中,以便在移动到下一个条目之前对其执行一些操作

我已经能够从上面的XML块中解析数据并将其存储到结构中,其中只存在一个
元素。也就是说,我能够成功地将类似的内容存储到结构中:

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

... 几个嵌套元素

解析xmml文件直到找到条目元素是一种方法:

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
        }
    }
}

根据中的文档和示例,我将这样做

主程序包
进口(
“编码/xml”
“日志”
)
//表示一个元素
类型数据结构{
XMLName xml.Name`xml:“数据”`
条目[]条目`xml:“条目”`
}
//表示一个元素
类型入口结构{
名称字符串`xml:“名称”`
Age int`xml:“Age”`
}
//测试数据
var testXML字符串=`
无名氏
28
无名氏
29
鲍勃·多伊
30
贝丝·多伊
31
`
func main(){
数据:=&数据{}
错误:=xml.Unmarshal([]字节(testXML),数据)
如果错误!=零{
log.Fatal(错误)
}
对于i:=0;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}

只要确保你正确处理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)
    }

    //...
}

如果您可以有两种或更多类型的标签,而不仅仅是
entry
标签,您会怎么做?e、 g.每个元素可以是
条目
记录
或类似内容,其中订单仍然重要。我在开关块打开了第二个问题,价值50个赏金点数,需要在for循环内。