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

如何在go中将2个xml标记解析为1个结构?,xml,go,encoding,Xml,Go,Encoding,我调用了2个标记,但我必须解析它们相同的结构。两者都有相同的东西,但在不同的标记中,我必须将它们混合到另一个xml中 <Products> <Product_name>TOY</Product_name> <\Products> <Goods> <Goods_name>TOY</Goods_name> <\Goods> 但我不会工作。你能帮我吗?没有更多的细节,很难给出一个好的答案 我不知

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

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

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

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

没有更多的细节,很难给出一个好的答案

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

我正在处理一个非常大的xml文件,为了限制内存消耗,我使用这个避免检查结束标记是否与开始标记匹配。 如果您需要以一种非常特殊的方式处理xml,那么您可以解析它并只获取所需的数据

这里是一个创建产品切片的示例

你可以在这里找到它:

主程序包
进口(
“编码/xml”
“fmt”
“字符串”
)
类型产品结构{
名称字符串
其他整数
}
func main(){
str:=strings.NewReader(“\nTOYP\n\n\n\nTOYG\n”)
fmt.Println(str)
var产品[]产品
解码器:=xml.NewDecoder(str)
为了{
t、 错误:=解码器。RawToken()
如果错误!=零{
打破
}
非弹性串
开关se:=t(类型){
case xml.StartElement:
inElement=strings.TrimSpace(se.Name.Local)
开关线{
案例“产品名称”:
失败
案例“货物名称”:
t、 错误:=解码器。RawToken()
如果错误!=零{
fmt.Printf(“错误%v\n”,错误)
打破
}
开关元件:=t(类型){
case xml.CharData:
products=append(products,Product{name:string(element)})
违约:
fmt.Println(“不应发生”)
持续
}
}
}
}
fmt.Println(产品)
}
输出:

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

<Goods>
<Goods_name>TOYG</Goods_name>
</Goods> 0 -1}
[{TOYP 0} {TOYG 0}]
&{
托伊普
玩具
0 -1}
[{TOYP 0}{TOYG 0}]

做一个标记并包含XML code.heu,以防这是
而不是
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}]