加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用冲突的元素名称解压缩Go中的XML

发布时间:2020-12-16 05:35:32 所属栏目:百科 来源:网络整理
导读:我有以下 XML,外部定义并且在我的组织控制之外: foo bar zipzip/zip /bar bar zapzap/zap /bar/foo 我正在使用这些结构: type Foo struct { XMLName xml.Name `xml:"foo"` Bar1 Bar1 Bar2 Bar2}type Bar1 struct { XMLName xml.Name `xml:"bar"` Zip strin
我有以下 XML,外部定义并且在我的组织控制之外:
<foo>
  <bar>
    <zip>zip</zip>
  </bar>
  <bar>
    <zap>zap</zap>
  </bar>
</foo>

我正在使用这些结构:

type Foo struct {
    XMLName xml.Name `xml:"foo"`
    Bar1    Bar1
    Bar2    Bar2
}

type Bar1 struct {
    XMLName xml.Name `xml:"bar"`
    Zip     string   `xml:"zip"`
}

type Bar2 struct {
    XMLName xml.Name `xml:"bar"`
    Zap     string   `xml:"zap"`
}

由于“bar”名称存在冲突,因此没有任何内容可以解组.如何填充Bar1和Bar2结构?

这就是我所拥有的:https://play.golang.org/p/D2IRLojcTB

这是我想要的结果:https://play.golang.org/p/Ytrbzzy9Ok

在第二个,我已经将第二个’bar’更新为’bar1′,这一切都有效.我宁愿想出一个更清晰的解决方案来修改传入的XML.

encoding / xml包将无法完全按照您的意愿执行,因为它会在遇到< bar>时决定Foo的哪个字段进行解码.元素,而不是处理该元素的子元素.您的结构定义使此决定不明确,因为xml.Unmarshal中的错误表明:

main.Foo field “Bar1” with tag “” conflicts with field “Bar2” with tag “”

以下两种方法可行:

1.使用一个Bar结构来覆盖两个分支

如果您将类型修改为:

type Foo struct {
    XMLName xml.Name `xml:"foo"`
    Bars    []Bar    `xml:"bar"`
}

type Bar struct {
    Zip string `xml:"zip"`
    Zap string `xml:"zap"`
}

现在,您将获得一个代表所有< bar>的切片.元素.您可以判断该元素是否具有< zip>或者< zap> element通过检查相应的字段是否为非空.

你可以在这里试用这个版本:https://play.golang.org/p/kguPCYmKX0

2.使用儿童选择器

如果您只对< bar>的单个子元素感兴趣在每个分支中,您可能根本不需要结构来表示该元素.例如,您可以解码为以下类型:

type Foo struct {
    XMLName xml.Name `xml:"foo"`
    Zip     string   `xml:"bar>zip"`
    Zap     string   `xml:"bar>zap"`
}

现在< bar>的孩子了元素将直接解码为Foo结构的成员.请注意,使用此选项,您将无法区分所选输入,例如:

<foo>
  <bar>
    <zip>zip</zip>
    <zap>zap</zap>
  </bar>
</foo>

如果这会导致问题,那么你应该选择第一个解决方案.

你可以在这里试用这个版本:https://play.golang.org/p/fAE_HSrv4y

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读