2014-04-17 1 views
0

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

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, который я использую здесь, чтобы создать желаемый результат, описанный выше? Заранее спасибо.

UPDATE

После ответа предоставленной @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()) {

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

+0

Спасибо @ TheManzet. Работая с вашим предложением, мне удалось решить проблему. Я обновил исходный вопрос, чтобы включить ответ. – danw

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