17370845950

Go语言怎么解析XML Go原生库处理XML数据教程
Go语言用encoding/xml包解析XML需定义带xml标签的导出结构体,通过xml.Unmarshal将字节数据转为对象;字段映射靠xml:"name,attr"等标签,嵌套结构体和切片分别处理子元素与同名列表,注意首字母大写、空元素零值及命名空间显式声明。

Go语言用encoding/xml包解析XML非常直接,不需要第三方库。核心是定义结构体并用结构标签(struct tag)映射XML元素和属性,再用xml.Unmarshal把字节数据转成Go对象。

结构体字段与XML标签对齐

XML解析的关键是让Go结构体“读懂”XML的层级和命名。字段名不重要,关键是xml标签里的值:

  • xml:"person" 表示该字段对应名为的XML元素
  • xml:"name,attr" 表示读取name="xxx"这样的属性
  • xml:",chardata" 表示读取元素的文本内容(比如25中的25
  • xml:"-" 表示忽略该字段
  • 嵌套结构体自动对应子元素;切片字段(如[]Item)可解析多个同名元素

解析简单XML示例

假设有如下XML字符串:

张三30

对应结构体写法:

type User struct {
    ID   int    `xml:"id,attr"`
    Name string `xml:"name"`
    Age  int    `xml:"age"`
}

解析代码:

data := []byte(`张三30`)
var u User
err := xml.Unmarshal(data, &u)
if err != nil {
    log.Fatal(err)
}
// u.ID == 101, u.Name == "张三", u.Age == 30

处理多层嵌套和列表

遇到

......这类结构,用切片+嵌套结构体即可:

type Users struct {
    XMLName xml.Name `xml:"users"`
    List    []User   `xml:"user"`
}

type User struct {
    ID   int    `xml:"id,attr"`
    Name string `xml:"name"`
    Tags []Tag  `xml:"tag"`
}

type Tag struct {
    Name string `xml:",chardata"`
}

这样Agoxml就能完整解析。

注意常见坑点

  • 结构体字段必须是导出的(首字母大写),否则xml包无法访问
  • 如果XML有声明,不影响解析,可直接包含或忽略
  • 空元素(如)会将对应字段设为零值,不是nil;需要区分时可用指针字段(如*string
  • 命名空间(如xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance")需在结构体中显式声明xml:"xsi,attr"或用xml.Name字段捕获

基本上就这些。Go的XML解析不复杂但容易忽略大小写和导出规则,对照XML样本写好结构体标签,再调一次Unmarshal,基本就跑通了。