package models import ( "encoding/xml" ) type MxGraphModel struct { XMLName xml.Name `xml:"mxGraphModel"` Root struct { XMLName xml.Name `xml:"root"` MxCell []MxCell `xml:"mxCell"` MxObject *[]MxObject `xml:"object"` MxLink []MxLink } } type MxCell struct { XMLName xml.Name `xml:"mxCell"` ID string `xml:"id,attr"` RID *string `xml:"rID,attr"` Rtype string `xml:"rType,attr"` Parent *string `xml:"parent,attr"` Edge *string `xml:"edge,attr"` Source *string `xml:"source,attr"` Target *string `xml:"target,attr"` } type MxLink struct { ID string `xml:"id,attr"` Source string `xml:"source,attr"` Target string `xml:"target,attr"` } type MxObject struct { XMLName xml.Name `xml:"object"` ID string `xml:"id,attr"` Settings []xml.Attr `xml:",any,attr"` MxCell MxCell `xml:"mxCell"` } // Didn't manage to differentiate Links and cells containing components using // only structures and unmarshal, so we use this method post-umarshalling func (g *MxGraphModel) createLinks() { var cells_without_links []MxCell for i, mxcell := range g.Root.MxCell { if mxcell.Edge != nil { mxcell.processLinks() newLink := MxLink{mxcell.ID,*mxcell.Source,*mxcell.Target} g.Root.MxLink = append(g.Root.MxLink,newLink) } else { cells_without_links = append(cells_without_links,g.Root.MxCell[i]) } } g.Root.MxCell = nil g.Root.MxCell = cells_without_links } func (cell *MxCell) processLinks() { v := "" if cell.Source == nil { cell.Source = &v } if cell.Target == nil { cell.Target = &v } } type mxissue struct { msg string } func (m *mxissue) Error() string { return m.msg } func newMxIssue(message string) error { return &mxissue{message} }