Golang解析XML数据遇到问题如何解决
Golang解析XML数据遇到问题如何解决 我正在尝试解析从API查询获取的一些XML数据,但遇到了困难。以下是我定义的结构体和XML数据本身。任何帮助都将不胜感激。
type ListTraceResponse struct {
ListTraceCompRows []ListTraceCompRow `xml:"<?xml version=\"1.0\" encoding=\"utf-8\"?><dp:ListTraceComponentsReply ReturnCode=\"0\" xmlns:dp=\"http://www.cisco.com/vtg/diagnosticportal\"><dp:Schema Version=\"1.0\" />"`
}
type ListTraceCompRow struct {
Name string `xml:"<dp:TraceComponent Name"`
TraceCompList []CompList `xml:"dp:TraceComponentList"`
}
type CompList struct {
Name string `xml:"TraceComponent Name"`
Description string `xml:"Description"`
}
<?xml version="1.0" encoding="utf-8"?>
更多关于Golang解析XML数据遇到问题如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
啊,原来还有能用的XML工具,之前没注意到。谢谢!
更多关于Golang解析XML数据遇到问题如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你可以使用专门的工具来实现这个功能。例如 zek - 从 XML 生成 Go 结构体。
func main() {
fmt.Println("hello world")
}
在解析XML数据时,你的结构体定义存在几个关键问题。主要问题在于XML标签定义不正确,特别是ListTraceResponse结构体中包含了完整的XML声明和根元素,这是不正确的。以下是修正后的代码示例:
package main
import (
"encoding/xml"
"fmt"
)
type ListTraceResponse struct {
XMLName xml.Name `xml:"http://www.cisco.com/vtg/diagnosticportal ListTraceComponentsReply"`
ReturnCode string `xml:"ReturnCode,attr"`
TraceComponents []TraceComponent `xml:"TraceComponent"`
}
type TraceComponent struct {
Name string `xml:"Name,attr"`
Description string `xml:"Description"`
}
func main() {
xmlData := `<?xml version="1.0" encoding="utf-8"?>
<dp:ListTraceComponentsReply ReturnCode="0" xmlns:dp="http://www.cisco.com/vtg/diagnosticportal">
<dp:TraceComponent Name="Component1">
<dp:Description>First component description</dp:Description>
</dp:TraceComponent>
<dp:TraceComponent Name="Component2">
<dp:Description>Second component description</dp:Description>
</dp:TraceComponent>
</dp:ListTraceComponentsReply>`
var response ListTraceResponse
err := xml.Unmarshal([]byte(xmlData), &response)
if err != nil {
fmt.Printf("Error unmarshaling XML: %v\n", err)
return
}
fmt.Printf("ReturnCode: %s\n", response.ReturnCode)
for i, comp := range response.TraceComponents {
fmt.Printf("Component %d: Name=%s, Description=%s\n",
i+1, comp.Name, comp.Description)
}
}
如果你的XML结构更复杂,需要处理嵌套元素,可以使用以下结构:
type ListTraceResponse struct {
XMLName xml.Name `xml:"http://www.cisco.com/vtg/diagnosticportal ListTraceComponentsReply"`
ReturnCode string `xml:"ReturnCode,attr"`
Components []Component `xml:"TraceComponent"`
}
type Component struct {
Name string `xml:"Name,attr"`
Description string `xml:"Description"`
SubComponents []SubComponent `xml:"SubComponent"`
}
type SubComponent struct {
ID string `xml:"ID,attr"`
Type string `xml:"Type"`
}
关键要点:
- 不要在结构体标签中包含XML声明或完整的XML片段
- 使用正确的命名空间处理(
xml:"http://...") - 属性使用
,attr标记 - 子元素直接使用元素名作为标签
运行修正后的代码将正确解析XML数据并输出结果。

