0

我正在使用 Jackson 类集来读取 CSV 文件,并将其转换为 xml,但需要一些关于如何添加嵌套值的建议。

我正在使用的代码是:

  package reader;

  import java.io.File;
  import java.io.IOException;
  import java.util.List;
  import java.util.Map;

  import com.fasterxml.jackson.databind.MappingIterator;
  import com.fasterxml.jackson.dataformat.csv.CsvMapper;
  import com.fasterxml.jackson.dataformat.csv.CsvSchema;
  import com.fasterxml.jackson.dataformat.xml.XmlMapper;

  public class Mustang
  {

public static void main(String[] args) throws Exception
{

    // Define the input file
    File input = new File("c:\\temp\\all_idocs.csv");
    // Define the output file
    File output = new File("c:\\temp\\all_idocs.xml");

    System.out.println("INFO: Commencing Conversion");

    List<Map<?, ?>> data = readObjectsFromCsv(input); // readObjectsFromCSV(input
                                                        // file name)

    System.out.println(readObjectsFromCsv(input));

    writeAsXml(data, output); // writeAsXml function, to output location

    System.out.println("INFO: Conversion Complete");

}

public static List<Map<?, ?>> readObjectsFromCsv(File file)
        throws IOException
{
    CsvSchema schema = CsvSchema.builder()  
            .addColumn("A0001")
            .addColumn("A0186")
            .addColumn("A0187")
            .addColumn("A0352")
            .addColumn("A0539")
            .addColumn("A0963")
            .addColumn("A1046")
            .addColumn("A0792")
            .addColumn("A0218")
            .addColumn("A0584")
            .addColumn("A0016")
            .addColumn("A0017")
            .addColumn("A0478")
            .addColumn("A0051")
            .addColumn("A0052")
            .addColumn("A0053")
            .addColumn("A0059")
            .addColumn("A0440")
            .addColumn("A0054")
            .addColumn("A0055")
            .addColumn("A0056")
            .addColumn("A0057")
            .addColumn("A0058")
            .addColumn("A1128")
            .addColumn("A0003")
            .addColumn("A0069")
            .addColumn("A0070")
            .addColumn("A0074")
            .addColumn("A0073")
            .addColumn("A0071")
            .addColumn("A0110")
            .addColumn("A0109")
            .addColumn("A0108")
            .build();

    CsvMapper csvMapper = new CsvMapper();
    MappingIterator<Map<?, ?>> mappingIterator = csvMapper
            .reader(Map.class).with(schema).readValues(file);  // Change the "with()" to pull in the schema

    return mappingIterator.readAll();
}

public static void writeAsXml(List<Map<?, ?>> data, File file)
        throws IOException
{
    XmlMapper mapper = new XmlMapper();
    mapper.writeValue(file, data);
}

}

如果我对一个 CSV 文件运行它,我会得到类似这样的输出:

<item>
    <A0001>J1000097</A0001>
    <A0186>5028197000004</A0186>
    <A0187>1</A0187>
    <A0352></A0352>
    <A0539>00</A0539>
    <A0963>20050209</A0963>
</item>

我想看看是否可以缩进/嵌套其中一些属性,以产生如下内容:

<item>
    <A0001>J1000097</A0001>
    <A0186>5028197000004</A0186>
    <A0187>
        <A0352>12</A0352>
        <A0539>00</A0539>
    </A0187>
    <A0963>20050209</A0963>
</item>

我假设我必须在代码的构建器部分中做一些事情,但是由于我是新手,所以我不知道怎么做。

4

1 回答 1

0

在这种情况下,您可能希望Map在从 CSV 读取它之后,但在将其写入 XML 之前进行处理。然后,您可以在要分组的值周围添加包装器。也就是说,类似:

Map<?,?> value = ... ; // individual row
Map<String,Object> wrapped = new LinkedHashMap<>();
wrapped.put("A0352", value.remove("A0352"));
wrapped.put("A0539", value.remove("A0539"));
value.put("A0187", wrapped);

另一种可能性是使用, 和用于处理分组的MapPOJO 类型之间的值转换。@JsonUnwrapped转换本身可以使用:

MyPOJO value = mapper.convertValue(map, MyPOJO.class); // and/or reverse

但这种方法可能会变得更加复杂。

于 2015-05-20T18:19:24.090 回答