专家能否提供一个使用apache freemarker将csv转换为xml的示例?包括模板定义和基本的java代码来做...谢谢。
答案 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将会中断。