Go:XML Unmarshal嵌套键值对

时间:2015-09-11 16:34:40

标签: xml go unmarshalling

我启动了一个处理XML输入的项目,我遇到了unmarshal方法的问题。我试图将下面的XML解组为结构体。这是多个值'标签,这很好,但在'值内?标签可以有一个'值'带有值的标签。或者有多个'值'带有'''值'的标签里面的标签。我试图在Go结构中捕获它,但到目前为止没有运气..

<lines>
<values>
    <key>Key_1</key>
    <value>Value_1</value>
</values>
<values>
    <key>Key_2</key>
    <value>
        <key>NestedKey_1</key>
        <value>NestedValue_1</value>
    </value>
    <value>
        <key>NestedKey_2</key>
        <value>NestedValue_2</value>
    </value>
</values>

Go struct:

type Value struct {
    Key string `xml:"key"`
    Value string `xml:"value"`
}

type Values struct {
    Key string `xml:"key"`
    Value []Value `xml:"value"`
}

type Lines struct {
    Values []Values `xml:"values"`
}

当我打印unmarshal输出时,我确实看到了Key_1和Key_2以及嵌套的键值对,但我没有在输出中看到Value_1。这是显而易见的,因为它是一个字符串而不是数组,任何人都知道如何解决这个问题?

游乐场:http://play.golang.org/p/I4U0lhPt5U

1 个答案:

答案 0 :(得分:0)

要看两件事:

  • 表示XML元素内容的struct类型可能有一个特殊字段&#34; XMLName&#34;类型为xml.Name

    这可以用于命名与XML元素不同的类型。

  • 通过&#34; xml&#34;为struct类型的字段指定的XML元素的名称tag可以使用>表示法指定元素的嵌套,例如

    Foo string `xml:"a>b>c"`
    

    这可以用来跳过不需要的中间(封闭)元素,并直接提取他们感兴趣的子元素。

所有这些内容都在package's doc for the Unmarshal() func中解释。

据说,这些功能可以让您处理问题。

如果您发现您的案件确实是病态的并且难以处理简单的解组,您可能会尝试接近它using XPath