我try 了相当多的 struct 来try 对该XML进行解组,但我无法真正弄清楚:

package main

import (
    "bytes"
    "encoding/xml"
    "fmt"
)

type SettingContainer struct {
    XMLName  xml.Name  `xml:"Settings"`
    Settings []Setting `xml:",any"`
}

type Setting struct {
    XMLName          xml.Name          `xml:",any"`
    SettingRegisters []SettingRegister `xml:",any"`
}

type SettingRegister struct {
    XMLName xml.Name `xml:",any"`
    Value   string   `xml:"value,attr"`
}

func main() {
    var xmlData = bytes.NewBufferString(`
    <Settings>
        <Setting0>
            <Setting0_register value="0x20" />
            <Setting0ArbitraryName value="0x0" />
        </Setting0>
        <Setting1>
            <Setting1_register value="0x60" />
            <Setting1WhateverEnable value="0x0" />
        </Setting1>
        <Setting2>
            <Setting2_register value="0x80" />
            <Setting2blahblah value="0x1" />
        </Setting2>
        <Setting4>
            <Setting4_register value="0x2fffff8" />
            <Setting4ThisCanBeAnything value="0x0" />
        </Setting4>
    </Settings>`)

    var s []SettingContainer
    xml.Unmarshal(xmlData.Bytes(), &s)

    for _, i := range s {
        fmt.Println(i)
    }
}

我就是不能让它打印任何东西.我实际需要的字段是SettingN_REGISTER以及SettingN标记名的值attr.我如何才能将XML正确地解组到这些字段中呢?我正在考虑制作一个定制的解组函数,但我真的找不到如何正确地制作一个.我能从这个XML中得到的只有"设置"标记名.

推荐答案

XMLName个字段中删除xml:",any"个标记(这会导致解码器try 将多余的子元素映射到该字段),并将其解组为SettingContainer而不是[]SettingContainer,因为一个XML文档只能有一个根元素.此处的工作示例:https://go.dev/play/p/dItnmEGH8oM

type SettingContainer struct {
    XMLName  xml.Name  `xml:"Settings"`
    Settings []Setting `xml:",any"`
}

type Setting struct {
    XMLName          xml.Name
    SettingRegisters []SettingRegister `xml:",any"`
}

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

func main() {
    var xmlData = bytes.NewBufferString(`...`)

    var s SettingContainer
    xml.Unmarshal(xmlData.Bytes(), &s)

    fmt.Println(s)
}

Go相关问答推荐

错误.如果它包含切片,则返回FALSE

Golang内置打印(Ln)函数&S行为怪异

在nixos上找不到XInput2.h头文件的包

go grpc:无法导入github.com/golang/protobuf/proto(没有所需的模块提供包github.com/gorang/protobuf-proto)

当我有外键时,如何使用 GORM 创建数据库的新条目

在运行时更改 Go lang slog 的日志(log)级别

无效操作:v > max(类型参数 T 与 > 不可比较)

如何将字节文件高效地读入int64切片?

使用反射在Go中递归迭代 struct 体和集合字段

Golang校验器包:重命名字段错误处理

在两个单独的速率受限端点之间同步请求

Get 请求在 Thunder 客户端/Postman 中返回数据,但在 Golang 代码中给出空白数据

Wire google Inject with multi return from provider 函数

Go:从 ssl 证书中获取 'subject/unstructeredName' 的值

Golang计算 struct struct 中的字段数

从golang中的url加载图像

每 N 秒运行一次函数,上下文超时

手动将 OpenTelemetry 上下文从 golang 提取到字符串中?

Go 赋值涉及到自定义类型的指针

函数参数的判断顺序是什么?