0

im trying to parse an xml:

attaching xml since its too long for herehttps://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)
    // }

}

but while the file is read correctly mi xml structures are empty

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)

its like the struct is empty: output : **

º panic: runtime error: index out of range goroutine 1 [running]: 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**

exit status 2

2
  • 1
    I suggest you try to reduce your problem by using a small XML file, simple tag names and then post the full code here. Commented Nov 10, 2022 at 19:12
  • Don't ignore the error returned by xml.Unmarshal. Commented Nov 11, 2022 at 0:18

1 Answer 1

0

if you want parser : in xml

like

xml:"n1:Level-1C_User_Product"

should be:

xml:"https://psd-14.sentinel2.eo.esa.int/PSD/User_Product_Level-1C.xsd Level-1C_User_Product"

see: Parse Xml in GO for atttribute with ":" in tag

follow is a demo:

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()
}

follow is output:

2022-11-09T16:55:19.024Zº

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.