Java CSV作为XML元素的文本节点
将CSV格式的数据放在xml元素中的利弊是什么 我必须用矩阵数据字段将java中的对象序列化为xml。我放弃了在Jaxb中使用数据绑定的想法;泛型和包含集合的集合太难处理了 我为我的矩阵想到了一个简单的模式,但是由于我还必须实现矩阵到CSV的序列化,为什么不将CSV字符串作为元素中的文本节点转储呢?这也会使文件变得更小 你能想出反对这个想法的理由吗 我是否应该向该元素添加类似csv mimetype的内容 编辑:这是我选择的解决方案。它使用超级CSV。需要枚举,因为泛型类型在运行时被擦除。主xml文件将引用csv文件Java CSV作为XML元素的文本节点,java,xml,csv,jaxb,xml-serialization,Java,Xml,Csv,Jaxb,Xml Serialization,将CSV格式的数据放在xml元素中的利弊是什么 我必须用矩阵数据字段将java中的对象序列化为xml。我放弃了在Jaxb中使用数据绑定的想法;泛型和包含集合的集合太难处理了 我为我的矩阵想到了一个简单的模式,但是由于我还必须实现矩阵到CSV的序列化,为什么不将CSV字符串作为元素中的文本节点转储呢?这也会使文件变得更小 你能想出反对这个想法的理由吗 我是否应该向该元素添加类似csv mimetype的内容 编辑:这是我选择的解决方案。它使用超级CSV。需要枚举,因为泛型类型在运行时被擦除。主xm
static public enum SerializableType{INTEGER,DOUBLE,...};
@SuppressWarnings("unchecked")
public static <T> Matrix<T> fromCSV(InputStream in, CsvPreference pref, SerializableType t)
{
Matrix<T> o = new Matrix<T>();
// Super-csv class
CsvListReader csv_reader = new CsvListReader(new InputStreamReader(in), pref);
Integer n = null;
try {
List<String> l = csv_reader.read();
n = l.size(); o.n = n;
int i=0;
while(l!=null)
{
o.appendRow();
T val;
for(int j=0;j<n;j++)
{
switch(t)
{
case INTEGER:
val = (T)Integer.valueOf(Integer.parseInt(l.get(j)));
break;
case DOUBLE:
val = (T)Double.valueOf(Double.parseDouble(l.get(j)));
break;
case <...>
default:
throw new IllegalArgumentException();
}
o.set(i,j, val);
}
i++;
l = csv_reader.read();
}
csv_reader.close();
} catch (IOException e) {
e.printStackTrace();
}
return o;
}
public static<T> void toCSV(Matrix<T> m, CsvListWriter csv_writer, SerializableType t)
{
try {
for(int i=0;i<m.rowCount();i++)
{
ArrayList<String> l = new ArrayList<String>();
for(int j=0;j<m.columnCount();j++)
{
if(m.get(i,j)==null)
{
l.add(null);
}
else{
switch(t)
{
case INTEGER:
l.add(Integer.toString((Integer)m.get(i,j)));
break;
case DOUBLE:
l.add(Double.toString((Double)m.get(i,j)));
break;
case
<...>
default:
throw new IllegalArgumentException();
};
}
}
csv_writer.write(l);
}
csv_writer.flush();
csv_writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
static public enum SerializableType{INTEGER,DOUBLE,…};
@抑制警告(“未选中”)
来自CSV的公共静态矩阵(InputStream-in、CsvPreference-pref、SerializableType)
{
矩阵o=新矩阵();
//超级csv类
CsvListReader csv_reader=新的CsvListReader(新的InputStreamReader(in),pref);
整数n=null;
试一试{
列表l=csv_reader.read();
n=l.size();o.n=n;
int i=0;
while(l!=null)
{
o、 appendRow();
T值;
对于(int j=0;jXML是一种很好的格式来构造某种信息,但对于其他类型的信息(如matrix)来说则是一种痛苦,这超出了XML库的技术限制,因为您不想让干净的表格表示到处都有这些可怕的尖括号,而且您通常需要基于split的快速解析
在这种情况下,您应该避免“如果您只有一把锤子,一切看起来都像钉子”综合症,您需要另一种能够自然处理表格数据的表示:CSV
因此,将这两种格式的优点结合起来的想法是正确的:XML用于需要结构化的数据,CSV用于表格数据
至于MIME类型,如果只有您的应用程序将处理该文件,那么您确实不需要指定它,但是添加一个文件确实不会花费太多;但是我不知道是否存在任何标准属性,除了类似“xsi:type=“CSV”的东西
PS:我在另一个上下文中写过上述综合征::)XML模式允许您定义一种集合类型,其中项目由空格分隔
<xs:list itemType="xs:int"/>
XmlAdapter(MatrixAdapter)
当您使用@XmlValue
注释int[]
时,XML表示将是空格分隔的文本
import java.util.*;
import javax.xml.bind.annotation.*;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class MatrixAdapter extends XmlAdapter<MatrixAdapter.AdaptedMatrix, int[][]>{
public static class AdaptedMatrix {
@XmlElement(name="row")
public List<AdaptedRow> rows;
}
public static class AdaptedRow {
@XmlValue
public int[] row;
}
@Override
public AdaptedMatrix marshal(int[][] matrix) throws Exception {
AdaptedMatrix adaptedMatrix = new AdaptedMatrix();
adaptedMatrix.rows = new ArrayList<AdaptedRow>(matrix.length);
for(int[] row : matrix) {
AdaptedRow adaptedRow = new AdaptedRow();
adaptedRow.row = row;
adaptedMatrix.rows.add(adaptedRow);
}
return adaptedMatrix;
}
@Override
public int[][] unmarshal(AdaptedMatrix adaptedMatrix) throws Exception {
List<AdaptedRow> adaptedRows = adaptedMatrix.rows;
int[][] matrix = new int[adaptedRows.size()][];
for(int x=0; x<adaptedRows.size(); x++) {
matrix[x] = adaptedRows.get(x).row;
}
return matrix;
}
}
input.xml/Output
<?xml version="1.0" encoding="UTF-8"?>
<root>
<matrix>
<row>1 2 3 4</row>
<row>5 6 7 8</row>
</matrix>
</root>
<?xml version="1.0" encoding="UTF-8"?>
<root>
<matrix>
<row>1 2 3</row>
<row>4 5 6</row>
<row>7 8 9</row>
</matrix>
</root>
1 2 3 4
5 6 7 8
input.xml/Output
<?xml version="1.0" encoding="UTF-8"?>
<root>
<matrix>
<row>1 2 3 4</row>
<row>5 6 7 8</row>
</matrix>
</root>
<?xml version="1.0" encoding="UTF-8"?>
<root>
<matrix>
<row>1 2 3</row>
<row>4 5 6</row>
<row>7 8 9</row>
</matrix>
</root>
1 2 3
4 5 6
7 8 9
在阅读了一些简洁的w3c规范(哎哟,这伤了我的大脑…)和一些维基百科文章之后,我想我将使用jar和XInclude的组合。我将把jar归档文件与csv文件的相对路径放在一些xml属性中(我将其命名为type)对于mimetype应用程序/csv,必须序列化的主类型的成员数据字段对象将位于jar中它们自己的xml文件中,并包含一个主文件。对于简单数组,这可能没问题,但对于一般集合,您必须编写10倍以上的代码……并且您无法将xml文件导入excel。