package models import ( "encoding/xml" "strconv" ) type MxGraphModel struct { XMLName xml.Name `xml:"mxGraphModel"` Root struct { XMLName xml.Name `xml:"root"` MxCell []MxCell `xml:"mxCell"` MxObject *[]MxObject `xml:"object"` } } type MxCell struct { XMLName xml.Name `xml:"mxCell"` ID string `xml:"id,attr"` Parent *string `xml:"parent,attr"` RID *string `xml:"rID,attr"` Source *string `xml:"source,attr"` Target *string `xml:"target,attr"` Rtype *string `xml:"rType,attr"` } type MxObject struct { XMLName xml.Name `xml:"object"` ID string `xml:"id,attr"` Settings []xml.Attr `xml:",any,attr"` MxCell MxCell `xml:"mxCell"` } type mxissue struct { msg string } func (m *mxissue) Error() string { return m.msg } func newMxIssue(message string) error { return &mxissue{message} } // mxCell inside object tags are create twice when unmarshalling // once as they appear in the xml inside the MxObject struct and once in the MxCell struct // so once retrieved from object we remove them from the root's MxCell list func (m *MxGraphModel) removeMxCell(id string){ int_id,_ := strconv.Atoi(id) int_id = int_id + 1 cell_id := strconv.Itoa(int_id) for i, cell := range(m.Root.MxCell){ if cell.ID == cell_id { m.Root.MxCell = append(m.Root.MxCell[:i],m.Root.MxCell[i+1:]...) } } }