登录
首页 >  Golang >  Go问答

Go语言中xml.Unmarshal处理多个根XML节点

来源:stackoverflow

时间:2024-03-27 15:15:32 382浏览 收藏

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《Go语言中xml.Unmarshal处理多个根XML节点》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

问题内容

我需要连接一个 api 并从中获取数据。无法更新 api。

对于错误有两种类型的响应:

database error

对于正常响应:


  test device

或者像这样:


  
    testuser
    user
  

我尝试实现的是将一个结构体设置为 xmlresponse,这样我可以首先检查它是否有错误,然后检查预期类型作为该结构体的成员。

以下是我为 api 实现的数据类型

type xmlresponse struct {
    error  *xmlerror
    result *xmlresult
}

type xmlerror struct {
    xmlname xml.name `xml:"error"`
    error   string   `xml:",innerxml"`
}

type xmlresult struct {
    xmlname xml.name `xml:"response"`
    device  *device
    user    *user
}

type device struct {
    xmlname xml.name `xml:"device"`
    id      int      `xml:"id,attr"`
    label   string   `xml:",innerxml"`
}

type user struct {
    xmlname  xml.name `xml:"user"`
    username string   `xml:"username"`
    role     string   `xml:"role"`
    age      int      `xml:"age,attr"`
}

但是使用 xml.unmarshal 不会产生预期的输出。但是,如果我将结果包装在某个元素中并调整 xmlresponse 结构,如下所示:


  database error

正常响应为:


  
    test device
  

结构为:

type XmlResponse struct {
    XMLName xml.Name   `xml:"envelope"`
    Error   *XmlError
    Result  *XmlResult
}

我可以得到预期的结果。

go演示中有示例代码。

有没有一种方法可以让我使用不同的根元素名称将 xml 解组到 xmlresponse 中而不进行包装?

更新:所有响应代码均为 200,因此我无法通过查看响应代码来区分错误和正常响应。


解决方案


为了捕获 API 返回的错误,您通常应该检查响应代码,然后采取相应的操作。 在您的情况下,应该返回一个>500的代码,表明存在服务器端错误。然后您可以尝试根据返回的错误消息格式解组响应正文。

如果这不是一个选项,您始终可以尝试解组到错误结构中,如果操作因错误而失败,您可以捕获它并解组到响应结构中。

但是您必须小心捕获哪个错误,因为未能解组到错误类型并不自动意味着它是有效的响应类型。

今天关于《Go语言中xml.Unmarshal处理多个根XML节点》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>