登录
首页 >  Golang >  Go问答

在Golang中解析XML却无法正确填充结构

来源:stackoverflow

时间:2024-03-09 21:12:27 171浏览 收藏

学习Golang要努力,但是不要急!今天的这篇文章《在Golang中解析XML却无法正确填充结构》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

问题内容

我正在尝试解析 xml:

附加 xml,因为它对于此处来说太长 https://drive.google.com/file/d/1cplec1gbar6n7lcyir_zvmejkowo3guu/view?usp=sharing

type l1cproduct struct {
    xmlname xml.name `xml:"n1:level-1c_user_product"`
    n1generalinfo n1generalinfo `xml:"n1:general_info"`
}

type n1generalinfo struct {
    xmlname xml.name `xml:"n1:general_info"`
    productinfo productinfo `xml:"product_info"`
    spectralinformationlist spectralinformationlist `xml:"product_image_characteristic>spectral_information_list"`
}

type spectralinformationlist struct {
    xmlname xml.name `xml:"spectral_information_list"`
    spectralinformation []spectralinformation `xml:"spectral_information"`
}

type spectralinformation struct {
    xmlname xml.name `xml:"spectral_information"`
    bandid string `xml:"bandid,attr"`
    physicalband string `xml:"physicalband,attr"`
}

type productinfo struct{
    xmlname xml.name `xml:"product_info"`
    productstarttime string `xml:"product_start_time"`
    generationtime string `xml:"generation_time"`
    producturi string `xml:"product_uri"`

}

func parsexml() {
    // open our xmlfile

    // xmlpath := inprocesspath + "/mtd_msil1c.xml"
    xmlpath := "/home/htc/lizer/backend/inprocessresults/mtd_msil1c.xml"
    xmlfile, err := os.open(xmlpath)
    // if we os.open returns an error then handle it
    if err != nil {
        fmt.println(err)
    }

    fmt.println("successfully opened " + xmlpath)
    // defer the closing of our xmlfile so that we can parse it later on
    defer xmlfile.close()

    // read our opened xmlfile as a byte array.
    bytevalue, _ := ioutil.readall(xmlfile)
    fmt.printf("\ndata: %s", bytevalue)
    // we initialize our users array
    var users l1cproduct
    // we unmarshal our bytearray which contains our
    // xmlfiles content into 'users' which we defined above
    xml.unmarshal(bytevalue, &users)
    fmt.println(users.n1generalinfo.productinfo.productstarttime + "º")
    println(users.n1generalinfo.spectralinformationlist.spectralinformation[1].bandid)
    // we iterate through every user within our users array and
    // print out the user type, their name, and their facebook url
    // as just an example
    // for i := 0; i < len(users.n1generalinfo.spectralinformationlist.spectralinformation); i++ {
    // for i := 0; i < 10; i++ {
    //     fmt.println("band id: " + users.n1generalinfo.spectralinformationlist.spectralinformation[i].bandid)
    //     fmt.println("physicalband: " + users.n1generalinfo.spectralinformationlist.spectralinformation[i].physicalband)
    // }

}

但是当文件被正确读取时,mi xml 结构是空的

fmt.Println(users.N1GeneralInfo.ProductInfo.ProductStartTime + "º")
    println(users.N1GeneralInfo.SpectralInformationList.SpectralInformation[1].BandId)

fmt.Println(users.N1GeneralInfo.ProductInfo.ProductStartTime + "º")
println(users.N1GeneralInfo.SpectralInformationList.SpectralInformation[1].BandId)

就像结构是空的: 输出:**

º 恐慌:运行时错误:索引超出范围 goroutine 1 [运行]: main.parsexml() /home/htc/lizer/backend/app/pkg/services/bandwith/service.go:164 +0x3fd main.main() /home/htc/lizer/backend/app/pkg/services/bandwith/service.go:53 +0x20**

退出状态2


正确答案


如果你想要 xml 中的解析器 :

喜欢

xml:"n1:level-1c_user_product"

应该是:

xml:“https://psd-14.sentinel2.eo.esa.int/psd/user_product_level-1c.xsd level-1c_user_product”

参见:Parse Xml in GO for atttribute with ":" in tag

以下是演示:

package main

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

type L1CProduct struct {
    XMLName       xml.Name `xml:"https://psd-14.sentinel2.eo.esa.int/PSD/User_Product_Level-1C.xsd Level-1C_User_Product"`
    N1GeneralInfo N1GeneralInfo
}

type N1GeneralInfo struct {
    XMLName     xml.Name    `xml:"https://psd-14.sentinel2.eo.esa.int/PSD/User_Product_Level-1C.xsd General_Info"`
    ProductInfo ProductInfo `xml:"Product_Info"`
}
type ProductInfo struct {
    XMLName          xml.Name `xml:"Product_Info"`
    ProductStartTime string   `xml:"PRODUCT_START_TIME"`
    GenerationTime   string   `xml:"GENERATION_TIME"`
    ProductUri       string   `xml:"PRODUCT_URI"`
}

func parseXml() {
    // Open our xmlFile

    // xmlPath := inProcessPath + "/MTD_MSIL1C.xml"
    xmlPath := "./MTD_MSIL1C.xml"
    // read our opened xmlFile as a byte array.
    byteValue, _ := os.ReadFile(xmlPath)
    // we initialize our Users array
    var users L1CProduct

    err := xml.Unmarshal(byteValue, &users)
    if err != nil {
        fmt.Printf("%v\n", err)
    }
    fmt.Println(users.N1GeneralInfo.ProductInfo.ProductStartTime + "º")
}

func main() {
    parseXml()
}

以下是输出:

2022-11-09t16:55:19.024zº

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>