gpt4 book ai didi

xml - 如何在 GO 中解码动态 XML

转载 作者:数据小太阳 更新时间:2023-10-29 03:36:13 25 4
gpt4 key购买 nike

我尝试使用 Go 解析 XML,它用于与另一个系统交换数据。我知道原则上如何使用 xml.Unmarshal 函数进行解析。然而,在协议(protocol)中根元素的子元素<PROTO>变化(见下面的例子)。对于子元素( REQUEST.DATA , REQUEST.ACL , REQUEST.NAC , ... - 超过二十种不同的)我用 xml:... 定义了结构-到目前为止的语法 - 这些单个子元素的解析有效。

但是,有没有一种很好的方法可以将整个消息解析为一个结构,其中一个变量类型取决于子元素?例如使用界面?

可能的 XML 消息示例:

<PROTO
version="1.00">
<REQUEST.DATA>
<DATA-L>Some information</DATA-L>
</REQUEST.DATA>
</PROTO>
<PROTO
version="1.00">
<REQUEST.ACK>
<ACK-ID>1</ACK-ID>
<REQUEST.ACK>
</PROTO>

我的 Go 应用程序的片段:

// XML: REQUEST.DATA
type DataRequest struct {
LData string `xml:"DATA-L"`
}

// XML: REQUEST.ACK
type AckRequest struct {
AckId int `xml:"ACK-ID"`
}

// XML: PROTO <============= ??
type Request struct {
Version float32 `xml:"version,attr"`
RemoteRequest {AckRequest, DataRequest, ...} ????
}

func main() {
message := `<PROTO version="1.00"><REQUEST.ACK><ACK-ID>1</ACK-ID><REQUEST.ACK></PROTO>`
data := `<REQUEST.ACK><ACK-ID>1</ACK-ID><REQUEST.ACK>`
doc := &AckRequest{}
err := xml.Unmarshal([]byte(data), &doc)
if err != nil {
fmt.Printf("error: %v", err)
return
}
fmt.Printf("data %+v", doc)
}

而不是只解析子元素 data我想解析整个文档 message (涉及 <PROTO>)。并希望有一个包含相应子元素信息的结构。

最佳答案

您可以将 DataRequestAckRequest 作为指针嵌入到 Request 结构中。这样您可以稍后检查它们是否为 nil

// XML: REQUEST.DATA
type DataRequest struct {
LData string `xml:"DATA-L"`
}

// XML: REQUEST.ACK
type AckRequest struct {
AckId int `xml:"ACK-ID"`
}

type Request struct {
Version float32 `xml:"version,attr"`
Ack *AckRequest `xml:"REQUEST.ACK"`
Data *DataRequest `xml:"REQUEST.DATA"`
}

func main() {
message := `<PROTO version="1.00"><REQUEST.ACK><ACK-ID>1</ACK-ID></REQUEST.ACK></PROTO>`
proto := &Request{}
err := xml.Unmarshal([]byte(message), &proto)
if err != nil {
fmt.Printf("error: %v", err)
return
}
// if proto.Ack == nil {
// fmt.Println("Ack is nil")
// }
fmt.Printf("data %+v\n", proto)
fmt.Printf("data %+v\n", proto.Ack)
}

data &{Version:1 Ack:0xc0000b6050 Data:}

data &{AckId:1}

您还可以实现自己的解码器并进行动态类型切换https://stackoverflow.com/a/33517875/1199408 .

关于xml - 如何在 GO 中解码动态 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56867536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com