问题描述
我有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}]