Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java CSV作为XML元素的文本节点_Java_Xml_Csv_Jaxb_Xml Serialization - Fatal编程技术网

Java CSV作为XML元素的文本节点

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

将CSV格式的数据放在xml元素中的利弊是什么

我必须用矩阵数据字段将java中的对象序列化为xml。我放弃了在Jaxb中使用数据绑定的想法;泛型和包含集合的集合太难处理了

我为我的矩阵想到了一个简单的模式,但是由于我还必须实现矩阵到CSV的序列化,为什么不将CSV字符串作为元素中的文本节点转储呢?这也会使文件变得更小

你能想出反对这个想法的理由吗

我是否应该向该元素添加类似csv mimetype的内容

编辑:这是我选择的解决方案。它使用超级CSV。需要枚举,因为泛型类型在运行时被擦除。主xml文件将引用csv文件

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。