上传并解析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 }