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

标签 xml go encoding

我有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,则可以解析它并仅获取所需的数据。
这是创建产品 slice 的示例
你可以在这里找到它:
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}]

关于xml - 如何在go中将2个xml标记解析为1个结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63906332/

相关文章:

python-2.7 - Scrapy::转储到 json 文件时出现编码问题

go - 没有文件保存在 VSCode 中的实时错误/警告

macos - MAC 去获取 github.com/go-gl/gl

javascript - 为什么atob和btoa不可逆

mod-rewrite - 如何重定向到包含 anchor (#) 的 url?

go - 如何使用将多个结构连接到同一个结构中

c++ - 使用pugixml使用C++解析数据但无法获取所有节点属性

Java、DOM 节点上的 XPath

Android 设计库 - float 操作按钮填充/边距问题

iphone - 在 objective-c 中从多级xml获取子标记