【问题标题】:Unmarshal xml node containing data and child解组包含数据和子节点的 xml 节点
【发布时间】:2018-07-25 08:29:06
【问题描述】:

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

我的 xml 看起来像这样:

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

我正在尝试解组为以下结构:

type Sort struct {
    Field string `xml:"field"`
    Order string `xml:"field>order"`
}

type Report struct {
    Sort Sort       `xml:"sort"`
}

不幸的是,这是抛出错误:

解组错误:v7.Sort 字段“字段”与标签“字段”冲突 带有“订单”字段,带有标签“字段>订单”

是否有实现此目的的内置方法,或者我是否正在考虑一些自定义解组

更新: 至少根据这个答案,如果 xml 有点难看,这应该是有效的:Can a XML element contain text and child elements at the same time?

【问题讨论】:

  • 这绝对不是有效的 XML,&lt;field&gt; 没有终止,只是完全无效。不要尝试将其解析为 xml。
  • 抱歉更正了 xml 示例,字段字段已终止(错字) - 但我认为仍然无效,因为节点内的数据和节点
  • 看起来有效,只是 order 不是字段的直接兄弟,而是文本节点的直接兄弟。

标签: xml go


【解决方案1】:

单个 XML 元素只能映射到单个 struct 字段,并且您的模型尝试将 &lt;field&gt; 映射到 2 个 struct 字段,因此不允许。

&lt;field&gt; 的字符数据和子元素&lt;order&gt; 处于同一个“级别”,它们是兄弟,所以它们必须在同一个结构中。但它们是不同类型的节点:要获取字符数据,使用xml:",chardata" struct 标签,要获取&lt;order&gt; 子元素的值,使用xml:"order" struct 标签。

所以使用下面的 Go 模型:

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"`
}

将您的输入 XML 解析到此模型中:

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>`

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

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

由于Sort 只包含一个Field 字段,我们可以将模型简化为:

type Field struct {
    Value string `xml:",chardata"`
    Order string `xml:"order"`
}

type Report struct {
    SortField Field `xml:"sort>field"`
}

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

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

【讨论】:

  • 我只是在研究 chardata - 是的,这很有效 - 感谢您的彻底回答
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
  • 2023-04-06
  • 2017-10-15
  • 2020-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多