解组包含数据和子节点的xml节点

时间:2018-02-14 17:11:31

标签: xml go

我不确定这是有效的xml,不幸的是它是我必须处理的 - 寻找有关如何完成的建议。

我的xml看起来像这样:

npm init

我试图解构以下结构:

<report>
    <sort>
        <field>type<order>ascending</order></field>
    </sort>
</report>

不幸的是,这引发了错误:

  

解组错误:v7.Sort字段&#34;字段&#34;标签&#34;字段&#34;冲突   with field&#34; Order&#34;标签&#34;字段&gt;订单&#34;

是否有内置的方法来实现这一点,或者我正在寻找一些自定义的解组

更新: 至少根据这个答案,如果稍微丑陋的xml:Can a XML element contain text and child elements at the same time?

,它应该是有效的

1 个答案:

答案 0 :(得分:1)

单个XML元素只能映射到单个struct字段,并且您的模型会尝试将<field>映射到2个struct字段,因此不允许这样做。

<order>和子元素xml:",chardata"的字符数据处于相同的“级别”,它们是兄弟姐妹,因此它们必须位于相同的结构中。但它们是不同类型的节点:要获取字符数据,使用<order> struct标记,并获取xml:"order"子元素的值,请使用type Field struct { Value string `xml:",chardata"` Order string `xml:"order"` } type Sort struct { Field Field `xml:"field"` } type Report struct { Sort Sort `xml:"sort"` } struct标记。< / p>

所以使用以下Go模型:

func main() {
    var r Report
    err := xml.Unmarshal([]byte(src), &r)
    fmt.Printf("%+v %v", r, err)
}

const src = `<report>
    <sort>
        <field>type<order>ascending</order></field>
    </sort>
</report>`

将输入XML解析为此模型:

{Sort:{Field:{Value:type Order:ascending}}} <nil>

输出是(在Go Playground上尝试):

Sort

由于Field只包含一个type Field struct { Value string `xml:",chardata"` Order string `xml:"order"` } type Report struct { SortField Field `xml:"sort>field"` } 字段,我们可以将模型简化为:

{SortField:{Value:type Order:ascending}} <nil>

它以相同的方式工作,给出类似的输出(在Go Playground上试试这个):

query{
   users{
    id
   }
}