Loading

上传并解析XML文件

  上传解析XML文件是分两部步,上传文件和解析文件,如果需要存储到持久层即数据库,可以再多一步存储。

  话不多说,直接上代码。

  1、上传文件,这里是用的Servlet,这里将二进制表单的文件全部放入了FileItem的集合里,然后以参数的形式传入ModleImportService对象的modleImport()方法中

 1                 //上传文件的目录
 2                 String uploadPath = System.getProperty("user.dir")+ this.getServletContext().getContextPath() + "/upload/" ;
 3                 //上传文件时的缓存文件的目录
 4                 String tempPath = uploadPath+"tmp/" ;
 5                 File file = new File(tempPath) ;
 6                 if(!file.isDirectory()){
 7                     //创建目录,包括不存在的父目录
 8                     file.mkdirs() ;
 9                 }
10                 int result = -2 ;
11                 //判断是否为二进制文件请求
12                 if(ServletFileUpload.isMultipartContent(request)) {
13                     //设置断点续传缓存路径
14                     DiskFileItemFactory factory = new DiskFileItemFactory() ;
15                     factory.setSizeThreshold(1024*1024) ;
16                     factory.setRepository(new File(tempPath)) ;
17                     //文件上传对象
18                     ServletFileUpload servletFileUpload = new ServletFileUpload(factory) ;
19                     servletFileUpload.setSizeMax(1024*1024*100) ;
20                     servletFileUpload.setHeaderEncoding("utf-8") ;
21                     //文件对象集合
22                     List<FileItem> fileItemList = new ArrayList<FileItem>() ;
23                     String memo = null ;
24                     //获取表单信息
25                     try {
26                         List<?> list = servletFileUpload.parseRequest(request) ;
27                         for(Object obj : list) {
28                             FileItem fileItem = (FileItem) obj ;
29                             //普通表单
30                             if(fileItem.isFormField()) {
31                                 String fieldName = fileItem.getFieldName() ;
32                                 if(fieldName != null && !fieldName.equals("")) {
33                                     if(fieldName.equals("memo")) {
34                                         //根据编码获取表单参数
35                                         memo = fileItem.getString("utf-8") ;
36                                     }
37                                 }
38                             //文件表单    
39                             }else {
40                                 //将文件表单对象存入集合当中
41                                 if(fileItem.getName().endsWith("xml")){
42                                     fileItemList.add(fileItem) ;
43                                 }                                
44                             }
45                         }
46                         ModleImportService modleService = new ModleImportService() ;
47                         result = modleService.modleImport(this.getServletContext(), fileItemList, uploadPath, memo) ;
48                     } catch (FileUploadException e) {
49                         e.printStackTrace();
50                     }
51                     if(result == 0) {
52                         //上传解析存储成功
53                         request.setAttribute("result", true) ;
54                     }else {
55                         //操作失败
56                         request.setAttribute("result", false) ;
57                     }
58                     request.getRequestDispatcher("modleList.do").forward(request, response) ;
59                 }
60                 return ;

 

  2、dom4j解析XML文件

    这个是业务层对象,其中调用ParseModleImportXML.parseXML()来解析XML文件

 1 import java.io.File;
 2 import java.util.Date;
 3 import java.util.List;
 4 
 5 import javax.servlet.ServletContext;
 6 
 7 import org.apache.commons.fileupload.FileItem;
 8 import org.apache.commons.logging.Log;
 9 import org.apache.commons.logging.LogFactory;
10 import org.hibernate.Session;
11 import org.hibernate.Transaction;
12 
13 import com.zldb.zclient.domain.HeatSpanCharge;
14 import com.zldb.zclient.domain.ModleFile;
15 import com.zldb.zclient.mode.dao.ModleImportDAO;
16 import com.zldb.zclient.util.DateFormat;
17 import com.zldb.zclient.util.HibernateUtil;
18 import com.zldb.zclient.util.ParseModleImportXML;
19 
20 public class ModleImportService {
21     private static final Log log = LogFactory.getLog(ModleImportService.class);41     
42     /**
43      * 保存 - 模型导入
44      * @param context
45      * @param fileItem
46      * @param memo
47      */
48     public int modleImport(ServletContext context, List<FileItem> fileList , String uploadPath, String memo) {
49         int result = -1 ;
50         ModleImportDAO dao = new ModleImportDAO() ;
51         Session session = HibernateUtil.getSession() ;
52         Transaction transaction = session.beginTransaction() ;
53         try {
54             for(FileItem fileItem : fileList) {
55                 //获取文件相对路基
56                 String name = fileItem.getName() ;
57                 //获取相对路径中的文件名
58                 StringBuffer fileName = new StringBuffer(name.substring(name.lastIndexOf("\\")+1)) ;
59                 //文件名添加一个时间戳
60                 fileName.append("[").append(DateFormat.format(new Date(), "yyyyMMddHHmmssSSS")).append("]") ;
61                 //根据文件路径和文件名生成文件对象
62                 File file = new File(uploadPath,fileName.toString()) ;
63                 //将文件写入磁盘中
64                 fileItem.write(file) ;
65                 //解析XML
66                 List<HeatSpanCharge> heatList = ParseModleImportXML.parseXML(file) ;
67                 //从磁盘中删除文件
68                 file.delete() ;
69                 //存储数据
70                 dao.saveHeatSpanCharge(session, heatList, fileName.toString(), memo) ;
71             }
72             //提交事务
73             transaction.commit() ;
74             result = 0 ;
75         }catch (Exception e) {
76             if(transaction != null) {
77                 transaction.rollback() ;
78             }
79             e.printStackTrace() ;
80             result = -2 ;
81         }finally {
82             HibernateUtil.closeSession() ;
83         }
84         return result ;
85     }
86     
87 }

  

  这里是ParseModleImportXML类,从XML文件中获取得都是String对象,最下面声明了一些静态方法,用来指定String对象往其他类型的转换方式。

  1 import java.io.BufferedInputStream;
  2 import java.io.File;
  3 import java.io.FileInputStream;
  4 import java.io.FileNotFoundException;
  5 import java.text.ParseException;
  6 import java.util.ArrayList;
  7 import java.util.Date;
  8 import java.util.Iterator;
  9 import java.util.List;
 10 
 11 import org.dom4j.Document;
 12 import org.dom4j.DocumentException;
 13 import org.dom4j.Element;
 14 import org.dom4j.io.SAXReader;
 15 
 16 import com.zldb.zclient.domain.HeatSpanCharge;
 17 
 18 public class ParseModleImportXML {
 19     
 20     public static List<HeatSpanCharge> parseXML(File file) throws FileNotFoundException, DocumentException, ParseException {
 21         List<HeatSpanCharge> heatList = new ArrayList<HeatSpanCharge>() ;
 22         //字节缓存流读取文件
 23         BufferedInputStream input = new BufferedInputStream(new FileInputStream(file)) ;
 24         //dom4j解析XML
 25         Document document = new SAXReader().read(input) ;
 26         Element root = document.getRootElement() ;
 27         Iterator<?> iterator = root.elementIterator("row") ;
 28         while(iterator.hasNext()) {
 29             Element element = (Element) iterator.next() ;
 30             HeatSpanCharge heat = new HeatSpanCharge() ;
 31             heat.setLocation(parseString(element.elementTextTrim("Location"))) ;
 32             heat.setUserType(parseString(element.elementTextTrim("UserType"))) ;
 33             heat.setUserState(parseString(element.elementTextTrim("UserState"))) ;
 34             heat.setName(parseString(element.elementTextTrim("Name"))) ;
 35             heat.setFloor(parseInt(element.elementTextTrim("Floor"))) ;
 36             heat.setUnit(parseInt(element.elementTextTrim("Unit"))) ;
 37             heat.setUserName(parseString(element.elementTextTrim("UserName"))) ;
 38             heat.setTelephone(parseString(element.elementTextTrim("Telephone"))) ;
 39             heat.setHeatUserId(parseString(element.elementTextTrim("HeatUserID"))) ;
 40             heat.setRoomNumber(parseInt(element.elementTextTrim("RoomNumber"))) ;
 41             heat.setHeatSpan(parseString(element.elementTextTrim("HeatSpan"))) ;
 42             heat.setAcreagePrice(parseDouble(element.elementTextTrim("AcreagePrice"))) ;
 43             heat.setPrepaidCharge(parseDouble(element.elementTextTrim("PrepaidCharge"))) ;
 44             heat.setBaseChargePrice(parseDouble(element.elementTextTrim("BaseChargePrice"))) ;
 45             heat.setBaseCharge(parseDouble(element.elementTextTrim("BaseCharge"))) ;
 46             heat.setHeatPrice(parseDouble(element.elementTextTrim("HeatPrice"))) ;
 47             heat.setChargedReformFee(parseDouble(element.elementTextTrim("ChargedReformFee"))) ;
 48             heat.setArrearReformFee(parseDouble(element.elementTextTrim("ArrearReformFee"))) ;
 49             heat.setSurplus(parseDouble(element.elementTextTrim("Surplus"))) ;
 50             heat.setArrearCharge(parseDouble(element.elementTextTrim("ArrearCharge"))) ;
 51             heat.setReturnsRate(parseDouble(element.elementTextTrim("ReturnsRate"))) ;
 52             heat.setDeductReformFee(parseDouble(element.elementTextTrim("DeductReformFee"))) ;
 53             heat.setTotalHeat(parseDouble(element.elementTextTrim("TotalHeat"))) ;
 54             heat.setHeatCharge(parseDouble(element.elementTextTrim("HeatCharge"))) ;
 55             heat.setMeterCharge(parseDouble(element.elementTextTrim("MeterCharge"))) ;
 56             heat.setUsedSpan(parseInt(element.elementTextTrim("UsedSpan"))) ;
 57             heat.setAverageTemperature(parseDouble(element.elementTextTrim("AverageTemperature"))) ;
 58             heat.setAverageInput(parseDouble(element.elementTextTrim("AverageInput"))) ;
 59             heat.setAverageOutput(parseDouble(element.elementTextTrim("AverageOutput"))) ;
 60             heat.setHeatLoad(parseDouble(element.elementTextTrim("HeatLoad"))) ;
 61             heat.setRebate(parseDouble(element.elementTextTrim("Rebate"))) ;
 62             heat.setAcreage(parseDouble(element.elementTextTrim("Acreage"))) ;
 63             heat.setCreateTime(parseDate(element.elementTextTrim("CreateTime"))) ;
 64             heat.setBuildingId(parseString(element.elementTextTrim("BuildingID"))) ;
 65             heat.setBuildingName(parseString(element.elementTextTrim("BuildingName"))) ;
 66             heat.setAreaId(parseString(element.elementTextTrim("AreaID"))) ;
 67             heat.setAreaName(parseString(element.elementTextTrim("AreaName"))) ;
 68             heat.setReturnFee(parseDouble(element.elementTextTrim("ReturnFee"))) ;
 69             heatList.add(heat) ;
 70         }
 71         return heatList ;
 72     }
 73     
 74     private static String parseString(String text) {
 75         String result = null ;
 76         if(text != null && !text.equals("(NULL)")){
 77             result = text ;
 78         }
 79         return result ;
 80     }
 81     
 82     private static Integer parseInt(String text){
 83         Integer i = null ;
 84         if(text != null && !text.equals("(NULL)")) {
 85             i = Integer.parseInt(text) ;
 86         }
 87         return i ;
 88     }
 89     
 90     private static Double parseDouble(String text) {
 91         Double d = null ;
 92         if(text != null && !text.equals("(NULL)")) {
 93             d = Double.parseDouble(text) ;
 94         }
 95         return d ;
 96     }
 97     
 98     private static Date parseDate(String text) throws ParseException {
 99         Date date = null ;
100         if(text != null && !text.equals("(NULL)")) {
101             date = DateFormat.parseTimestamp(text) ;
102         }
103         return date ;
104     }
105     
106 }

 

  3、存入数据库,业务层里面有用的ModleImportDAO对象来处理数据的保存

 1 import java.util.Date;
 2 import java.util.List;
 3 
 4 import org.hibernate.Session;
 5 
 6 import com.zldb.zclient.domain.HeatSpanCharge;
 7 import com.zldb.zclient.domain.ModleFile;
 8 
 9 public class ModleImportDAO {
10     
11     /**
12      * 保存 - 模型内容
13      * @param session
14      * @param list
15      * @param fileName
16      * @param memo
17      */
18     public void saveHeatSpanCharge(Session session, List<HeatSpanCharge> list, String fileName, String memo) {
19         int count = 0 ;
20         ModleFile modle = new ModleFile() ;
21         modle.setName(fileName) ;
22         modle.setCreateDate(new Date()) ;
23         modle.setMemo(memo) ;
24         session.save(modle) ;
25         for(int i=0; i<list.size(); i++) {
26             HeatSpanCharge heat = list.get(i) ;
27             heat.setModleId(modle.getId()) ;
28             heat.setIsOperator(0) ;
29             session.save(heat) ;
30             count++ ;
31             if(count%50 == 0) {
32                 session.flush() ;
33                 session.clear() ;
34             }
35         }
36     }
37     
38     
39 }

 

 

 

posted @ 2014-04-09 14:56  孤独的天  阅读(1169)  评论(0编辑  收藏  举报