Problem

我需要将XML从第三方应用程序解组到我的GO struct .

what i tried

我创建了 struct ,并且能够从我的代码中生成相同的XML.

ValidXML

我简化了这个示例的xml:

<Parent>
    <Name>tic.TEST</Name>
    <MetaData>
        <LawFormID Type="129" DefinedSize="3">DOO</LawFormID>
        <FirmUQ Type="129" DefinedSize="15">BARTOG</FirmUQ>
        <FirmDescription Type="200" DefinedSize="100">Bartog d.o.o. Trebnje</FirmDescription>
    </MetaData>
</Parent>

Structs

我对应的 struct 如下.

type Parent struct {
    Name string
    MetaData []Node `xml:"MetaData>any"`
}

type Node struct {
    XMLName     xml.Name // this allows custom node names
    Type        int      `xml:"Type,attr,omitempty"`
    DefinedSize int      `xml:"DefinedSize,attr,omitempty"`
    Text        string   `xml:",chardata"` // required at some places, cannot omit
}

@TestMetadata_Marshal


func TestMetaData_Marshal(t *testing.T) {
    parent := Parent{
        Name: "tic.TEST",
        MetaData: []Node{
            {
                XMLName: xml.Name{
                    Local: "LawFormID",
                },
                Text:        "DOO",
                Type:        129,
                DefinedSize: 3,
            }, {
                XMLName: xml.Name{
                    Local: "FirmUQ",
                },
                Text:        "BARTOG",
                Type:        129,
                DefinedSize: 15,
            }, {
                XMLName: xml.Name{
                    Local: "FirmDescription",
                },
                Text:        "Bartog d.o.o. Trebnje",
                Type:        200,
                DefinedSize: 100,
            },
        }, // \MetaData
    }
    HaveXML := XML(parent)
    fmt.Println(HaveXML)
    if ValidXML != HaveXML {
        t.Error(fmt.Errorf("marshaled XML did not match. Have: %v", HaveXML))
    }
}

Unmarshal

this is where the troubles begin; the test func is trivial; result is that no entries in MetaData are available.
I tried a lot of different tags, also tried creating an own MetaData struct containing Items []Node

func TestUnmarshal() {
    var parent Parent
    err := xml.Unmarshal([]byte(ValidXML), &parent)
    if err != nil {
        fmt.Println(err)
        return
    }
    HaveXML := XML(parent)
    if ValidXML == HaveXML {
        fmt.Println("\tmarshaled XML is Valid")
    } else {
        fmt.Printf("\tmarshaled XML did not match. Have:\n%v\n", HaveXML)
    }
}

go play (turned tests into 'normal' funcs

https://goplay.tools/snippet/kWS29HR7O9t

Question

在go&amp;中不可能做到这一点吗;xml?

推荐答案

问题是any不是标签名,而是一个选项.所以当使用它时,你必须在它前面加一个逗号,例如xml:",any".

我认为你不能把它和>结合起来,所以创建一个单独的MetaData struct :

type Parent struct {
    Name     string
    MetaData MetaData `xml:"MetaData"`
}

type MetaData struct {
    Nodes []Node `xml:",any"`
}

通过此重构,您的示例可以正常工作并输出(在Go Playground上try ):

=== TestMarshal
<Parent>
    <Name>tic.TEST</Name>
    <MetaData>
        <LawFormID Type="129" DefinedSize="3">DOO</LawFormID>
        <FirmUQ Type="129" DefinedSize="15">BARTOG</FirmUQ>
        <FirmDescription Type="200" DefinedSize="100">Bartog d.o.o. Trebnje</FirmDescription>
    </MetaData>
</Parent>
    marshaled XML is Valid
=== TestUnmarshal
    marshaled XML is Valid

Go相关问答推荐

从Kafka到Clickhouse的实时消费数据

在不耗尽资源的情况下处理S3文件下载

在Mac中使用uname获取处理器体系 struct 时,在为AMD64构建Go二进制时出现错误结果

nixOS 上的 Nginx 反向代理在try 加载 css/js 时返回 404

是否可以将 http.ServeHttp 包装在 go 中以使用 alexedwards/scs/v2 添加会话

Go Template 动态获取变量

「GORM错误」不支持的数据类型:&[],不正确的模式

在 Go 中使用 Apache Arrow 按时间间隔对事件进行分区

Golang 到 wasm 编译使用 tinygo.使用 wasmtime 执行

尽管存在 WaitGroup,Goroutines 似乎被打断了

GoLang: gocui 边框 colored颜色

Gremlin-Go:树步骤不可序列化

读取非UTF8编码的文件内容并正确打印出来

使用innerxml在 Go 中编码 XML 是否仅适用于某些类型?

如何编写一个以字符串或错误为参数的通用函数?

NaN 是 golang 中的可比类型吗?

如果服务器在客户端的 gRPC 中不可用,则等待的方法

如何排除溢出矩阵的坐标

Go lang - 惯用的默认后备

Terraform 自定义提供程序 - 数据源架构