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 только один раз, если вы делаете это для каждой строки, он должен работать.