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

关键要点:

  1. 不要在结构体标签中包含XML声明或完整的XML片段
  2. 使用正确的命名空间处理(xml:"http://..."
  3. 属性使用,attr标记
  4. 子元素直接使用元素名作为标签

运行修正后的代码将正确解析XML数据并输出结果。

回到顶部