2015-05-19 2 views
0

Я использую набор классов Jackson для чтения в CSV-файле и преобразовываю его в xml, но вам нужно дать совет о том, как добавить вложенное значение.Использование построителя для создания вложенных 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> 

Я предполагаю, что я должен иметь, чтобы сделать что-нибудь g в разделе строителя кода, но поскольку я новичок в его использовании, я не могу понять, как это сделать.

ответ

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); 

другой возможности будет использовать преобразование значений между Map и типом POJO, который использует @JsonUnwrapped для обработки группировки. Конверсия сама может быть сделано с помощью:

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

, но этот подход может стать более сложным.

Смежные вопросы