我启动了一个处理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>

转到结构:
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"`
}

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

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

最佳答案

要看的两件事:

  • 代表XML元素内容的struct类型可能具有xml.Name类型的特殊字段“XMLName”。

    可以使用这种类型来命名与XML元素不同的类型。
  • 通过“xml”标记为struct类型的字段指定的XML元素的名称可能使用>表示法指定元素的嵌套,例如
    Foo string `xml:"a>b>c"`
    

    这可用于跳过不需要的中间(包围)元素,并直接提取其感兴趣的子元素。

  • 所有这些内容在package's doc for the Unmarshal() func中进行了说明。

    据说,这些功能应该可以使您处理问题。

    如果您发现自己的病例确实是病态的并且很难处理简单的拆封,则可以尝试使用using XPath进行处理。

    关于xml - Go:XML解码嵌套的键/值对,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32528184/

    10-10 18:46
    查看更多