如何将混合元素的 xml 序列映射到 go 结构?

Posted

技术标签:

【中文标题】如何将混合元素的 xml 序列映射到 go 结构?【英文标题】:How to map an xml sequence of mixed elements to a go struct? 【发布时间】:2015-05-02 19:14:32 【问题描述】:

正在尝试加载一个 XML 文件,该文件包含无限的混合元素序列(XSD 中序列中的选择) 文件看起来像这样:

<RootNode>
    <ElementB>...</ElementB>
    <ElementA>...</ElementA>
    <ElementA>...</ElementA>
    <ElementC>...</ElementC>
    <ElementB>...</ElementB>
    <ElementA>...</ElementA>
    <ElementB>...</ElementB>
</RootNode>

我使用 xml.Unmarshal 来初始化和填充这些结构:

type RootNode struct 
    ElementA []ElementA
    ElementB []ElementB
    ElementC []ElementC


type ElementA struct 


type ElementB struct 


type ElementC struct 

我在这里有工作示例http://play.golang.org/p/ajIReJS35F。 问题是我需要知道原始序列中元素的索引。有了这个描述,这个信息就丢失了。

有没有办法在同一个数组中加载 ElementA、ElementB 或 ElementC 类型的元素?更一般地说,将混合元素列表映射到 go 结构的最佳方法是什么?

【问题讨论】:

【参考方案1】:

您可以在根节点上使用xml:",any" 标签,然后将其余部分解组为具有XMLName 字段的结构,如下所示:

type RootNode struct 
    Elements []Element `xml:",any"`


type Element struct 
    XMLName xml.Name

更多关于xml:",any"XMLNamehere。

游乐场示例:http://play.golang.org/p/Vl9YI8GG1E

【讨论】:

以上是关于如何将混合元素的 xml 序列映射到 go 结构?的主要内容,如果未能解决你的问题,请参考以下文章

将 PDF 转换为 XML 结构

如何在c#中使用具有相同名称但不同属性和结构的元素反序列化XML

使用 Go 保留 YAML 映射的顺序

如何反序列化/序列化“混合”数据结构(在 C# 中)

Clojure:如何将映射条目的惰性序列转换为结构映射?

将 XML 节点映射到 HTML 表单元素