如何将嵌套的XML元素解组成数组?

bel*_*nta 3 xml go unmarshalling

我的XML包含一组预定义元素,但我无法获取数组.这是XML结构:

var xml_data = `<Parent>
                   <Val>Hello</Val>
                   <Children>
                      <Child><Val>Hello</Val></Child>
                      <Child><Val>Hello</Val></Child>
                      <Child><Val>Hello</Val></Child>
                   </Children>
                </Parent>`
Run Code Online (Sandbox Code Playgroud)

这是完整的代码,这里是游乐场链接.运行它将获取Parent.Val,但不是Parent.Children.

package main

import (
    "fmt"
    "encoding/xml"
)

func main() {

    container := Parent{}
    err := xml.Unmarshal([]byte(xml_data), &container)

    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(container)  
    }
}

var xml_data = `<Parent>
                   <Val>Hello</Val>
                   <Children>
                      <Child><Val>Hello</Val></Child>
                      <Child><Val>Hello</Val></Child>
                      <Child><Val>Hello</Val></Child>
                   </Children>
                </Parent>`

type Parent struct {
    Val string
    Children []Child
}

type Child struct {
    Val string
}
Run Code Online (Sandbox Code Playgroud)

编辑:我在这里简化了一下这个问题.基本上我不能解组任何数组,而不仅仅是预定义的结构.以下是更新的工作代码.在该示例中,只有一个项目在容器界面中结束.

func main() {

    container := []Child{}
    err := xml.Unmarshal([]byte(xml_data), &container)

    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(container)  
    }

    /* 
        ONLY ONE CHILD ITEM GETS PICKED UP
    */
}

var xml_data = `
            <Child><Val>Hello</Val></Child>
            <Child><Val>Hello</Val></Child>
            <Child><Val>Hello</Val></Child>
        `

type Child struct {
    Val string
}
Run Code Online (Sandbox Code Playgroud)

sny*_*nyh 19

type Parent struct {
    Val string
    Children []Child  `xml:"Children>Child"`  //Just use the '>'
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个更好的不那么混乱的解决方案,并确认工作:https://play.golang.org/p/K4WhGBJnfp (3认同)

pet*_*tek 7

对于这种嵌套,您还需要一个Children元素结构:

package main

import (
    "fmt"
    "encoding/xml"
)

func main() {

    container := Parent{}
    err := xml.Unmarshal([]byte(xml_data), &container)

    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(container)  
    }
}

var xml_data = `<Parent>
            <Val>Hello</Val>
            <Children>
                <Child><Val>Hello</Val></Child>
                <Child><Val>Hello</Val></Child>
                <Child><Val>Hello</Val></Child>
            </Children>
        </Parent>`

type Parent struct {
    Val string
    Children Children
}

type Children struct {
    Child []Child
}

type Child struct {
    Val string
}
Run Code Online (Sandbox Code Playgroud)

也贴在这里:去游乐场

请注意,您的代码可以使用这种 XML 结构(在将变量名从 更改Children为 之后Child):

<Parent>
    <Val>Hello</Val>
    <Child><Val>Hello</Val></Child>
    <Child><Val>Hello</Val></Child>
    <Child><Val>Hello</Val></Child>
</Parent>
Run Code Online (Sandbox Code Playgroud)

  • @believesInSanta,您可以避免为嵌套元素使用单独的结构 [通过使用特制标签](https://play.golang.org/p/7aGWd0Crnb)。请实际花点时间阅读 [此处](https://golang.org/pkg/encoding/xml/#Unmarshal) 解释的 XML 解组规则:`encoding/xml` 包有一些强大的工具,可能没有仅略读互联网中的随机示例就很明显;-) (2认同)