Golang解析XML时出现问题

Golang解析XML时出现问题 我正在尝试解析XML

playground

但我得到

arr.Data 未定义(类型 Data 没有字段或方法 Data)

我期望输出

01 Hello

02 GoodBue
6 回复

更多关于Golang解析XML时出现问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在你的版本中第一个元素 01 Hello 缺失了。实际上确实需要遍历 for 循环,因为这只是一个示例,真实数据量要大得多。

你的 Data 只包含单个 Cue,而 XML 中有两个。XML 似乎只保留了其中的最后一个。

因此,你需要修改 Data,使其包含一个 Cue 数组。

一些可供学习的示例:

GitHub图标

GitHub

头像

mandolyte/xml-utils

示例和有用的命令行工具。通过在GitHub上创建帐户为mandolyte/xml-utils开发做出贡献。

XML文档具有单一的根元素Data。无需进行迭代操作,直接访问arr的成员即可。

package main

import "fmt"
import "encoding/xml"

type Data struct {
	XMLName xml.Name `xml:"Data"`
	Cue     Cue      `xml:"Cue"`
}

type Cue struct {
	XMLName xml.Name `xml:"Cue"`
	Value   string   `xml:"value,attr"`
	Cdata   string   `xml:",chardata"`
}

func main() {
	x := `<?xml version='1.0'?><Data contentPath='local'><Cue value='01'><![CDATA[Hello]]></Cue><Cue value='02'><![CDATA[Goodbye]]></Cue></Data>`

	var arr Data
	xml.Unmarshal([]byte(x), &arr)

	fmt.Println(arr)
	fmt.Println(arr.Cue)
}

https://play.golang.org/p/wMmflUWmNvl

问题出在您的XML结构定义和解析逻辑上。XML中的<data>元素包含多个<item>子元素,但您的结构体定义没有正确反映这种嵌套关系。

以下是修正后的代码:

package main

import (
	"encoding/xml"
	"fmt"
)

type Data struct {
	XMLName xml.Name `xml:"data"`
	Items   []Item   `xml:"item"`
}

type Item struct {
	XMLName xml.Name `xml:"item"`
	ID      string   `xml:"id"`
	Value   string   `xml:"value"`
}

func main() {
	xmlData := `
<data>
    <item>
        <id>01</id>
        <value>Hello</value>
    </item>
    <item>
        <id>02</id>
        <value>GoodBue</value>
    </item>
</data>`

	var data Data
	err := xml.Unmarshal([]byte(xmlData), &data)
	if err != nil {
		fmt.Printf("Error: %v\n", err)
		return
	}

	for _, item := range data.Items {
		fmt.Printf("%s %s\n", item.ID, item.Value)
	}
}

主要修改点:

  1. Data结构体中的字段从Data []Item改为Items []Item,并使用正确的XML标签xml:"item"
  2. 添加了XMLName字段来明确指定XML元素名称
  3. 遍历时使用data.Items而不是arr.Data

输出结果:

01 Hello
02 GoodBue

这样就能正确解析XML并输出期望的结果了。

回到顶部