使用构建器创建嵌套XML

时间:2015-05-19 09:26:13

标签: java xml jackson builder fasterxml

我使用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>

我假设我必须在代码的构建器部分中执行某些操作,但由于我不习惯使用它,我无法理解其中的内容。

1 个答案:

答案 0 :(得分:0)

在这种情况下,您可能希望在从CSV读取之后处理Map,但在将其写为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);

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

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

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