package tablib import ( "bytes" "github.com/agrison/mxj" ) // XML returns a XML representation of the Dataset as an Exportable. func (d *Dataset) XML() (*Exportable, error) { return d.XMLWithTagNamePrefixIndent("row", " ", " ") } // XML returns a XML representation of the Databook as an Exportable. func (d *Databook) XML() (*Exportable, error) { b := newBuffer() b.WriteString("\n") for _, s := range d.sheets { b.WriteString(" \n " + s.title + "\n ") row, err := s.dataset.XMLWithTagNamePrefixIndent("row", " ", " ") if err != nil { return nil, err } b.Write(row.Bytes()) b.WriteString("\n ") } b.WriteString("\n") return newExportable(b), nil } // XMLWithTagNamePrefixIndent returns a XML representation with custom tag, prefix and indent. func (d *Dataset) XMLWithTagNamePrefixIndent(tagName, prefix, indent string) (*Exportable, error) { back := d.Dict() exportable := newExportable(newBuffer()) exportable.buffer.WriteString("\n") for _, r := range back { m := mxj.Map(r.(map[string]interface{})) if err := m.XmlIndentWriter(exportable.buffer, prefix, indent, tagName); err != nil { return nil, err } } exportable.buffer.WriteString("\n" + prefix + "") return exportable, nil } // LoadXML loads a Dataset from an XML source. func LoadXML(input []byte) (*Dataset, error) { m, _, err := mxj.NewMapXmlReaderRaw(bytes.NewReader(input)) if err != nil { return nil, err } // this seems quite a bit hacky datasetNode, _ := m.ValueForPath("dataset") rowNode := datasetNode.(map[string]interface{})["row"].([]interface{}) back := make([]map[string]interface{}, 0, len(rowNode)) for _, r := range rowNode { back = append(back, r.(map[string]interface{})) } return internalLoadFromDict(back) }