如何在go中将2个xml标记解析为1个结构?

问题描述

我有2个标记,但是我必须解析它们相同的结构。两者都有相同的东西,但是在不同的标签中,我必须将它们混合到另一个xml中。

<Products>
  <Product_name>TOY</Product_name>
<\Products>

<Goods>
  <Goods_name>TOY</Goods_name>
<\Goods>

我尝试过这样:

type Products struct {
XMLName  xml.Name  `xml:"Products,Goods"`
Products []Product `xml:"Product"`}

但是我不会工作。你能帮我吗?

解决方法

没有更多细节,很难提供一个好的答案。

我不知道您xml的大小,是否只需要解析一些标签或整个文件。

我正在使用非常大的xml文件,以限制内存消耗,因此我使用decoder.RawToken来避免检查结束标记是否与开始标记匹配。 如果您需要以非常特定的方式处理xml,则可以解析它并仅获取所需的数据。

下面是创建产品切片的示例

您可以在这里找到它: https://play.golang.org/p/a4VirqzXjLP

package main

import (
    "encoding/xml"
    "fmt"
    "strings"
)

type Product struct {
    name  string
    other int
}

func main() {
    str := strings.NewReader("<Products>\n<Product_name>TOYP</Product_name>\n</Products>\n\n<Goods>\n<Goods_name>TOYG</Goods_name>\n</Goods>")
    fmt.Println(str)
    var products []Product
    decoder := xml.NewDecoder(str)
    for {
        t,err := decoder.RawToken()
        if err != nil {
            break
        }
        var inElement string
        switch se := t.(type) {
        case xml.StartElement:
            inElement = strings.TrimSpace(se.Name.Local)
            switch inElement {
            case "Product_name":
                fallthrough
            case "Goods_name":
                t,err := decoder.RawToken()
                if err != nil {
                    fmt.Printf("Err %v\n",err)
                    break
                }
                switch element := t.(type) {
                case xml.CharData:
                    products = append(products,Product{name: string(element)})
                default:
                    fmt.Println("should not happen")
                    continue
                }
            }
        }
    }
    fmt.Println(products)

}

输出:

&{<Products>
<Product_name>TOYP</Product_name>
</Products>

<Goods>
<Goods_name>TOYG</Goods_name>
</Goods> 0 -1}
[{TOYP 0} {TOYG 0}]