SAX: XML parsing

package com.yangshan.eship.labelex.service.impl;

import com.jcraft.jsch.ChannelSftp;
import com.yangshan.eship.labelex.entity.TrackEventActivityEnum;
import com.yangshan.eship.labelex.entity.TrackInfo;
import com.yangshan.eship.labelex.repository.b2c.TrackInfoDao;
import com.yangshan.eship.labelex.service.B2CService;
import com.yangshan.eship.labelex.util.SFTPUtils;
import org.apache.http.client.utils.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Vector;
import java.util.stream.Collectors;

/**
 * @author: Yifan
 * @Description:
 * @date: 2019/8/9
 * Modified By:
 */
@Service
public class B2CServiceImpl extends DefaultHandler implements B2CService {
    private static Logger logger = LoggerFactory.getLogger(B2CService.class);

    @Value("${aviaOrderTrack.b2c.labelUrl}")
    private String labelUrl;
    @Value("${aviaOrderTrack.b2c.userName}")
    private String userName;
    @Value("${aviaOrderTrack.b2c.ip}")
    private String ip;
    @Value("${aviaOrderTrack.b2c.port}")
    private String port;
    @Value("${aviaOrderTrack.b2c.cdPath}")
    private String cdPath;
    @Value("${aviaOrderTrack.b2c.key}")
    private String key;
    @Value("${aviaOrderTrack.b2c.keyPass}")
    private String keyPass;

    private List<TrackInfo> trackInfoList;
    private TrackInfo trackInfo;
    private String preTag;

    @Autowired
    private TrackInfoDao trackInfoDao;

    @Override
    publicTrackInfo Integer () { 
        SFTPUtils sftpUtils = new new SFTPUtils (); 
        List <TrackInfo> = trackInfoAllList new new the ArrayList <TrackInfo> ();
         the try {
             // establish a connection 
            ChannelSftp channelSftp = sftpUtils.getChannel (the userName, IP, Port, Key, keypass) ; 
            channelSftp.cd (cdpath); 
            logger.info ( "B2C track crawl, successfully entered the catalog} {" , cdpath);
             // get the list of files 
            list <String> fileNameList = getFileNameList (channelSftp); 
            fileNameList =fileNameList.stream () the sorted (Comparator.reverseOrder ()) the collect (Collectors.toList ());.. 
            logger.info ( "B2C crawler track, a file list of {}" , fileNameList.size ());
             / / get the latest list of files 
            Long oldMaxFileNo = trackInfoDao.getMaxFileNo ();
             IF (! oldMaxFileNo = null {) 
                fileNameList . = fileNameList.stream () filter (fileName -> Long.valueOf (fileName.split ( "-") [2] )> oldMaxFileNo) .collect (Collectors.toList ()); 
            } 
            logger.info ( "B2C crawler track, a total list of files to be parsed to {}" , fileNameList.size ());
             // parse tracking information 
            for(String fileName: fileNameList) {
                 // Get the specified file 
                the InputStream inputStream = channelSftp.get (fileName); 
                List <TrackInfo> trackInfoSubList = getTrackInfoList (inputStream); 

                for (TrackInfo trackInfo: trackInfoSubList) { 
                    trackInfo.setFileNo (fileName.split ( " - ") [2 ]); 
                } 
                trackInfoAllList.addAll (trackInfoSubList); 
            } 
            trackInfoDao.save (trackInfoAllList); 
            logger.info ( " B2C tracking gripping the analyzed were introduced article tracking data {} " , trackInfoAllList.size () ); 
        } the catch (Exception e) {
            logger.info(e.getMessage(), e);
        }

        return trackInfoAllList.size();
    }

    /**
     * @Author: Yifan
     * @Date: 2019/8/9 16:23
     * @Description: 获取TrackInfoList
     */
    public List<TrackInfo> getTrackInfoList(InputStream inputStream) throws Exception {
        SAXParserFactory factory = SAXParserFactory.newInstance();
        SAXParser parser = factory.newSAXParser();
        B2CServiceImpl handler = new B2CServiceImpl();
        parser.parse(inputStream, handler);
        return handler.getTrackInfoList();
    }

    public List<TrackInfo> getTrackInfoList() {
        return trackInfoList;
    }

    @Override
    public void startDocument() throws SAXException {
        trackInfoList = new ArrayList<TrackInfo>();
    }

    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
        if ("Event".equals(qName)) {
            trackInfo = new TrackInfo();
        }
        preTag = qName;
    }

    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if ("Event".equals(qName)) {
            trackInfoList.add(trackInfo);
            trackInfo = null;
        }
        preTag = null;
    }

    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (preTag != null) {
            String content = new String(ch, start, length);
            if ("TrackID".equals(preTag)) {
                trackInfo.setTrackId(content);
            } else if ("TYPNumber".equals(preTag)) {
                trackInfo.setTypNumber(content);
            } else if ("PackageNumber".equals(preTag)) {
                trackInfo.setPackageNumber(content);
            } else if ("OrderNumber".equals(preTag)) {
                trackInfo.setOrderNumber(content);
            } else if ("ParcelWeight".equals(preTag)) {
                trackInfo.setParcelWeight(content);
            } else if ("TrackEventActivity".equals(preTag)) {
                trackInfo.setTrackEventActivity(TrackEventActivityEnum.valueOf(content));
            } else if ("TrackEventCarrier".equals(preTag)) {
                trackInfo.setTrackEventCarrier(content);
            } else if ("TrackEventNumber".equals(preTag)) {
                trackInfo.setTrackEventNumber(content);
            } else if ("TrackEventCode".equals(preTag)) {
                trackInfo.setTrackEventCode(content);
            } else if ("TrackEventStatus".equals(preTag)) {
                trackInfo.setTrackEventStatus(content);
            } else if ("TrackEventDate".equals(preTag)) {
                trackInfo.setTrackEventDate(DateUtils.parseDate(content, new String[]{"yyyy-MM-dd HH:mm:ss".intern()}));
            } else if ("TrackEventComment".equals(preTag)) {
                trackInfo.setTrackEventComment(content);
            } else if ("TrackEventCity".equals(preTag)) {
                trackInfo.setTrackEventCity(content);
            } else if ("TrackEventLocation".equals(preTag)) {
                trackInfo.setTrackEventLocation(content);
            } else if ("TrackEventCountry".equals(preTag)) {
                trackInfo.setTrackEventCountry(content);
            } else if ("TrackURL".equals(preTag)) {
                trackInfo.setTrackUrl(content);
            }
        }
    }

    /**
     * @Author: Yifan
     * @Date: 2019/8/6 15:30
     * @Description: 获取文件名列表
     */
    public List<String> getFileNameList(ChannelSftp channelSftp) throws Exception {
        List<String> fileNameList = new ArrayList<String>();

        Vector<String> files = channelSftp.ls("*");
        for (int i = 0; i < files.size(); i++) {
            Object obj = files.elementAt(i);
            if (obj instanceof ChannelSftp.LsEntry) {
                ChannelSftp.LsEntry entry = (ChannelSftp.LsEntry) obj;
                if (true && !entry.getAttrs().isDir()) {
                    fileNameList.add(entry.getFilename());
                } else {
                    throw new Exception("发现非法目录");
                }
            }
        }

        return fileNameList;
    }

}

 

Guess you like

Origin www.cnblogs.com/yifanSJ/p/11352088.html