Convert XML file to CSV in java

后端 未结 8 898
时光说笑
时光说笑 2020-12-05 01:17

@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

8条回答
  •  感动是毒
    2020-12-05 01:49

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

提交回复
热议问题