I have an example that I'm attempting to parse. I'm able to get the <Documents>
but cannot get <ChangeOrders>
. I've combined what I've seen in a few other questions on the site here, specifically these:
Unmarshaling XML in Go, golang xml Unmarshal, Golang XML parse
Below is what I've written so far:
package main
import (
"bytes"
"encoding/json"
"encoding/xml"
"fmt"
"log"
)
type AgileData struct {
Documents []Document `xml: "AgileData>Documents"`
ChangeOrder ChangeOrder `xml: "AgileData>ChangeOrders"`
}
type ChangeOrder struct {
CoverPage CoverPage `xml:"CoverPage"`
}
type CoverPage struct {
Number string `xml:"Number"`
}
type Document struct {
TitleBlock TitleBlock `xml:"TitleBlock"`
Attachments []Attachments `xml:"Attachments"`
}
type TitleBlock struct {
Number string `xml:"Number"`
LifecyclePhase string `xml:"LifecyclePhase"`
Rev string `xml:"Rev"`
EffectivityDate string `xml:"EffectivityDate"`
}
type Attachments struct {
FileName string `xml:"FileName"`
EFD string `xml:"List01"`
}
func main() {
agile_xml := `
<AgileData xmlns="http://www.oracle.com/webfolder/technetwork/xml/plm/2016/09/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xsi:schemaLocation="http://www.oracle.com/webfolder/technetwork/xml/plm/2016/09/ http://www.oracle.com/webfolder/technetwork/xml/plm/2016/09/aXML.xsd">
<ChangeOrders>
<CoverPage>
<Number>C0000001</Number>
</CoverPage>
</ChangeOrders>
<Documents>
<TitleBlock>
<Number>D00000001</Number>
<LifecyclePhase>Published</LifecyclePhase>
<Rev>001 C00000001</Rev>
</TitleBlock>
<Attachments>
<FileName>some-file.docx</FileName>
<List01>PDF with banners</List01>
</Attachments>
</Documents>
<Documents>
<TitleBlock>
<Number>D00000002</Number>
<LifecyclePhase>Published</LifecyclePhase>
<Rev>001 C00000001</Rev>
</TitleBlock>
<Attachments>
<FileName>some-other-file.docx</FileName>
<List01>No distribution</List01>
</Attachments>
</Documents>
</AgileData>
`
xmlReader := bytes.NewReader([]byte(agile_xml))
yourAgileData := new(AgileData)
if err := xml.NewDecoder(xmlReader).Decode(yourAgileData); err != nil {
log.Panic(err.Error())
}
printX(yourAgileData)
}
func printX(x interface{}) (err error) {
var xBytes []byte
xBytes, err = json.MarshalIndent(x, "", " ")
if err != nil {
return
}
fmt.Println(string(xBytes))
return
}
If you run this, I get back data in Documents[]
, but ChangeOrder
is blank. I'm not sure what I've missed.
"ChangeOrder": {
"CoverPage": {
"Number": ""
}
}
Extra question: Why does go vet complain about these lines?
Documents []Document `xml: "AgileData>Documents"`
ChangeOrder ChangeOrder `xml: "AgileData>ChangeOrders"`
If I remove the space between "xml:" and "AgileData..", the warning goes away but then the Documents[] array starts to return empty.