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)
}