Java - скрипт для преобразования CSV в XML не разбит на строки

Я чрезвычайно новичок в Java и следую этому руководству, чтобы преобразовать файл CSV в XML в Mule ESB, используя класс Java, который использует Flatpack. Вот входной файл, который я использую:

Item1|Item2|Item3|Item4
Item5|Item6|Item7|Item8

И вот мой желаемый результат:

<root>
    <rows>
        <a>Item1</a>
        <b>Item2</b>
        <c>Item3</c>
        <d>Item4</d>
    </rows>
    <rows>
        <a>Item5</a>
        <b>Item6</b>
        <c>Item7</c>
        <d>Item8</d>
    </rows>
</root>

Я использовал скрипт Java в точности так, как он указан в руководстве:

public class CsvConverter {

 private static char delimiter = '|';
 private static char qualifier = '"';
 private static boolean ignoreFirstRecord = false;

 public CsvConverter() {

 }

 public String convert(String csv)  {
  StringReader sr = new StringReader(csv);
  FileReader fr = null;

  //Get the configuration file for csv processing
  try {
   fr = new FileReader("src/main/resources/usermap.xml");
  } catch (FileNotFoundException e) {   
   e.printStackTrace();
  }

  //The csv parser
  Parser p = DefaultParserFactory.getInstance().newDelimitedParser(fr, sr,delimiter, qualifier, ignoreFirstRecord);

  DefaultDataSet d = (DefaultDataSet) p.parse();

  //Build the xml
  DocumentBuilderFactory dFact = DocumentBuilderFactory.newInstance();
        DocumentBuilder build;
        Document doc=null;
  try {
   build = dFact.newDocumentBuilder();

        doc = build.newDocument();
  } catch (ParserConfigurationException e) {

   e.printStackTrace();
  }
        Element root = doc.createElement("root");
        doc.appendChild(root);

        Element Details = doc.createElement("rows");
        root.appendChild(Details);


  while (d.next()) {

    String[] colums = d.getColumns();
    for(int i=0; i<colums.length;i++ ){
     Element name = doc.createElement(colums[i]);
              name.appendChild(doc.createTextNode(d.getString(colums[i])));
              Details.appendChild(name);
    }

  }
  TransformerFactory tf = TransformerFactory.newInstance();
  Transformer transformer=null;
  StringWriter writer = null;

  try {
   transformer = tf.newTransformer();
   writer = new StringWriter();
   transformer.transform(new DOMSource(doc), new StreamResult(writer));
  } catch (TransformerConfigurationException e) {

   e.printStackTrace();
  } catch (TransformerException e) {

   e.printStackTrace();
  }


  String output = writer.getBuffer().toString();

  return output;

 }

}

И это usermap.xml файл:

<?xml version="1.0"?>
<!DOCTYPE PZMAP SYSTEM "flatpack.dtd">
<PZMAP>
<COLUMN name="a"/>
<COLUMN name="b"/>
<COLUMN name="c"/>
<COLUMN name="d"/>
</PZMAP>

Теперь вывод, который я получаю, выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <rows>
        <a>Item1</a>
        <b>Item2</b>
        <c>Item3</c>
        <d>Item4</d>
        <a>Item5</a>
        <b>Item6</b>
        <c>Item7</c>
        <d>Item8</d>
    </rows>
</root>

Как вы можете видеть, он не помещает каждый ряд в свой <rows> тег, вместо этого он объединяет все строки в одну <rows> тег. Я очень плохо знаю Java и до сих пор не смог диагностировать проблему. Можно ли изменить скрипт Java, который я здесь использую, для создания желаемого результата, который я обрисовал в общих чертах выше? Заранее спасибо.

ОБНОВИТЬ

После ответа, предоставленного @TheManzet, с небольшим экспериментированием следующая модификация while цикл сработал:

while (d.next()) {

    Element Details = doc.createElement("rows");

    String[] colums = d.getColumns();
    for(int i=0; i<colums.length;i++ ){
     Element name = doc.createElement(colums[i]);
              name.appendChild(doc.createTextNode(d.getString(colums[i])));
              Details.appendChild(name);
    }

    root.appendChild(Details);

  }

1 ответ

Решение

У меня нет способа проверить в данный момент, но я бы попробовал переехать root.appendChild(Details); внутри вашего цикла while сразу после while (d.next()) {

Прямо сейчас вы добавляете элемент row только один раз, если вы делаете это для каждой строки, он должен работать.

Другие вопросы по тегам