将csv转换为xml的freemarker示例

时间:2018-03-23 07:40:43

标签: java freemarker

专家能否提供一个使用apache freemarker将csv转换为xml的示例?包括模板定义和基本的java代码来做...谢谢。

https://freemarker.apache.org/

1 个答案:

答案 0 :(得分:0)

这两个问题,从CSV生成,并生成XML,是正交的。只有第一个有任何专业,所以让我们先看看。

很大程度上取决于您如何加载该CSV。我可以讲述Apache Commons CSV的情况。您可以像这样加载CSV(我更喜欢使用命名列,并且必须忽略标题行):

public List<CSVRecord> getCsv() throws IOException {
    try (Reader r = ...) {
        return CSVFormat.EXCEL.withHeader("foo", "bar", "baaz").withSkipHeaderRecord()
                .parse(r)
                .getRecords();
    }
}

您只需将List<CSVRecord>放入数据模型中,就像其他任何内容一样,在我的情况下,名称为csv

此时您可能已在模板中使用<#list csv as record>,但您必须编写${record.get('foo')}以插入一个详细的单元格值。所以为了使它更好,我有这个额外的设置:

public class CSVAwareObjectWrapper extends DefaultObjectWrapper {

    public CSVAwareObjectWrapper(Version incompatibleImprovements) {
        super(incompatibleImprovements);
    }

    @Override
    protected TemplateModel handleUnknownType(Object obj) throws TemplateModelException {
        if (obj instanceof CSVRecord) {
            return new CSVRecordModel((CSVRecord) obj);
        }
        return super.handleUnknownType(obj);
    }

    public class CSVRecordModel implements TemplateHashModel {
        private final CSVRecord csvRecord;

        public CSVRecordModel(CSVRecord csvRecord) {
            this.csvRecord = csvRecord;
        }

        @Override
        public TemplateModel get(String key) throws TemplateModelException {
            return wrap(csvRecord.get(key));
        }

        @Override
        public boolean isEmpty() throws TemplateModelException {
            return csvRecord.size() == 0;
        }

    }

}

然后我设置了FreeMarker Configuration

cfg.setObjectWrapper(new CSVAwareObjectWrapper(Configuration.VERSION_2_3_27));

现在您可以在模板中执行以下操作:

<records>
<#list csv as record>
  <record>
    <foo>${record.foo}</foo>
    <bar>${record.bar}</bar>
    <baaz>${record.baaz}</baaz>
  </record>
</#list>
</records>

此外,请不要忘记确保XML auto escaping处于活动状态,否则如果您在CSV中有&等生成的XML将会中断。