@Before There will be probably some duplicate questions suggestions, I don\'t think that is the case maybe read this first, I\'ll try to be as brief as possible. Title gives
Here some code that implements the conversion of the XML to CSV using StAX. Although the XML you gave is only an example, I hope that this shows you how to handle the optional elements.
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import java.io.*;
public class App
{
public static void main( String[] args ) throws XMLStreamException, FileNotFoundException
{
new App().convertXMLToCSV(new BufferedInputStream(new FileInputStream(args[0])), new BufferedOutputStream(new FileOutputStream(args[1])));
}
static public final String ROOT = "root";
static public final String ITEM = "Item";
static public final String ITEM_ID = "ItemID";
static public final String ITEM_DETAILS = "ListingDetails";
static public final String START_TIME = "StartTime";
static public final String END_TIME = "EndTime";
static public final String ITEM_URL = "ViewItemURL";
static public final String AVERAGES = "averages";
static public final String AVERAGE_TIME = "AverageTime";
static public final String AVERAGE_PRICE = "AveragePrice";
static public final String SEPARATOR = ",";
public void convertXMLToCSV(InputStream in, OutputStream out) throws XMLStreamException
{
PrintWriter writer = new PrintWriter(out);
XMLStreamReader xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(in);
convertXMLToCSV(xmlStreamReader, writer);
}
public void convertXMLToCSV(XMLStreamReader xmlStreamReader, PrintWriter writer) throws XMLStreamException {
writer.println("ItemID,StartTime,EndTime,ViewItemURL,AverageTime,AveragePrice");
xmlStreamReader.nextTag();
xmlStreamReader.require(XMLStreamConstants.START_ELEMENT, null, ROOT);
while (xmlStreamReader.hasNext()) {
xmlStreamReader.nextTag();
if (xmlStreamReader.isEndElement())
break;
xmlStreamReader.require(XMLStreamConstants.START_ELEMENT, null, ITEM);
String itemID = nextValue(xmlStreamReader, ITEM_ID);
xmlStreamReader.nextTag(); xmlStreamReader.require(XMLStreamConstants.START_ELEMENT, null, ITEM_DETAILS);
String startTime = nextValue(xmlStreamReader, START_TIME);
xmlStreamReader.nextTag();
String averageTime = null;
String averagePrice = null;
if (xmlStreamReader.getLocalName().equals(AVERAGES))
{
averageTime = nextValue(xmlStreamReader, AVERAGE_TIME);
averagePrice = nextValue(xmlStreamReader, AVERAGE_PRICE);
xmlStreamReader.nextTag();
xmlStreamReader.require(XMLStreamConstants.END_ELEMENT, null, AVERAGES);
xmlStreamReader.nextTag();
}
String endTime = currentValue(xmlStreamReader, END_TIME);
String url = nextValue(xmlStreamReader,ITEM_URL);
xmlStreamReader.nextTag(); xmlStreamReader.require(XMLStreamConstants.END_ELEMENT, null, ITEM_DETAILS);
xmlStreamReader.nextTag(); xmlStreamReader.require(XMLStreamConstants.END_ELEMENT, null, ITEM);
writer.append(esc(itemID)).append(SEPARATOR)
.append(esc(startTime)).append(SEPARATOR)
.append(esc(endTime)).append(SEPARATOR)
.append(esc(url));
if (averageTime!=null)
writer.append(SEPARATOR).append(esc(averageTime)).append(SEPARATOR)
.append(esc(averagePrice));
writer.println();
}
xmlStreamReader.require(XMLStreamConstants.END_ELEMENT, null, ROOT);
writer.close();
}
private String esc(String string) {
if (string.indexOf(',')!=-1)
string = '"'+string+'"';
return string;
}
private String nextValue(XMLStreamReader xmlStreamReader, String name) throws XMLStreamException {
xmlStreamReader.nextTag();
return currentValue(xmlStreamReader, name);
}
private String currentValue(XMLStreamReader xmlStreamReader, String name) throws XMLStreamException {
xmlStreamReader.require(XMLStreamConstants.START_ELEMENT, null, name);
String value = "";
for (;;) {
int next = xmlStreamReader.next();
if (next==XMLStreamConstants.CDATA||next==XMLStreamConstants.SPACE||next==XMLStreamConstants.CHARACTERS)
value += xmlStreamReader.getText();
else if (next==XMLStreamConstants.END_ELEMENT)
break;
// ignore comments, PIs, attributes
}
xmlStreamReader.require(XMLStreamConstants.END_ELEMENT, null, name);
return value.trim();
}
}