buildmaestro
buildmaestro

Reputation: 1456

go unmarshal xml with attributes

Having trouble getting xml to unmarshal so I can access xml attributes. Not sure what I'm doing wrong at this point. It complies, but the struct doesn't appear to contain any data.

import (
    "io/ioutil"
    "encoding/xml"
    "fmt"
)

contents of xml:

  <module id="Core" description="Core Module" tenantId="tenant1" major="3" minor="4" patch="0" build="0">
    <probePath path="bin" />
  </module>
</metadata>
type ModuleField struct {
    Id string `xml:"id,attr"`
    Description string `xml:"description,attr"`
    TenantId string `xml:"tenantId,attr"`
    Major string `xml:"major,attr"`
    Minor string `xml:"minor,attr"`
    Patch string `xml:"patch,attr"`
}

type Module struct {
    ModuleField ModuleField
    ProbePath string `xml:"probePath"`
}

type Metadata struct {
    XMLName xml.Name `xml:"metadata"`
    Module Module
}

// read xml file
    raw, _ := ioutil.ReadFile(XMLLoc)
    if err != nil {
        return
    }


    var XMLData Metadata 
    xml.Unmarshal(raw, &XMLData)

    // nothing is being printed
    fmt.Println(">",XMLData.Module.ModuleField.TenantId,"<")


Upvotes: 0

Views: 772

Answers (1)

mkopriva
mkopriva

Reputation: 38313

Letter case matters, so the element module will not be unmarshaled into a field called Module, you need to add the proper tag. Also you'll need to embed the ModuleField into Module so that its fields are promoted to Module and only then they will be unmarshaled. Or, alternatively, you can remove ModuleField and move all its fields into Module.

https://play.golang.org/p/AvaEpcKY-oh

Upvotes: 1

Related Questions