项目中需要用到导出xml和导入xml功能,故总结一下自己所做的:
用到的技术
XMLUtil为XML工具类:
public class XMLUtil { private final static org.slf4j.Logger logger = LoggerFactory.getLogger(XMLUtil.class); private XMLUtil() { } /** * 根据字符串创建 document 对象 * * @param xmlStr * @return */ public static Document getDocumentByString(String xmlStr) { Document doc = null; try { doc = DocumentHelper.parseText(xmlStr); } catch (DocumentException e) { logger.error("字符串转换成XML失败:" + e.getMessage()); } return doc; } /** * 设置response的返回信息 * @param response * @param fileName * @return XMLWriter */ public static XMLWriter getXMLWriter(HttpServletResponse response,String fileName) { XMLWriter writer = null; OutputStream os = null; try { //定义xml文件的格式 OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("UTF-8"); //准备输出xml文件 writer =new XMLWriter(format); response.setContentType("application/xml"); response.setHeader("Content-disposition", "attachment;filename=" + new String(fileName.getBytes(), "iso-8859-1")); os = response.getOutputStream(); writer.setOutputStream(os); }catch (Exception e){ logger.error("导出xml时获取XMLWriter出错:"+e); }finally { if(null != os){ try { os.close(); } catch (IOException e) { logger.error("关闭outputStream出错:"+e); } } } return writer; } /** * 根据file获得Document * @param file MultipartFile * @return Document */ public static Document getDocumentByFile(MultipartFile file){ File file1 = new File(file.getOriginalFilename()); Document document = null; try { file.transferTo(file1); //创建SAXReader对象 SAXReader reader = new SAXReader(); //读取文件 转换成Document document = reader.read(file1); } catch (IOException e) { document = null; logger.error("文件转换出错:"+e); } catch (DocumentException e) { document = null; logger.error("读取文件出错:"+e); } return document; } }
导出:
1、response设置输出的ContentType和Header
2、利用XMLWriter的write方法输出document对象
核心代码:
writer = XMLUtil.getXMLWriter(response,"导出文件名");
writer.write(document);
导入:
1、利用SpringMVC的MultipartFile上传文件,并使用SAXReader
读取文件。
核心代码:
XMLUtil.getDocumentByFile();
controller完整代码: /** * 导出模版,模版为xml格式 * @param response * @param id */ @RequestMapping(value = "/exportTmp") public void exportTmp(HttpServletResponse response, String id){ if(StringUtils.isNotBlank(id)){ XMLWriter writer = null; try { //创建xml Element root = DocumentHelper.createElement("Person"); Document document = DocumentHelper.createDocument(root); Element element1 = root.addElement("学生"); element1.addElement("姓名").addText("小章"); element1.addElement("年龄").addText("21"); Element element2 = root.addElement("学生"); element2.addElement("姓名").addText("小红").addElement("爱好").addText("唱歌"); element2.addElement("年龄").addText("22"); writer = XMLUtil.getXMLWriter(response,"导出xml.xml"); writer.write(document); } catch (Exception e) { e.printStackTrace(); }finally { try { if(null != writer){ writer.close(); } } catch (IOException e) { logger.error("关闭XMLWriter出错:"+e); } } } } /** * 导入模版,格式为xml * @param file * @return */ @RequestMapping(value = "/importXml",method = {RequestMethod.POST}) @ResponseBody public DwzJsonResponse importXml(@RequestParam(value="file",required=false) MultipartFile file){ if(file == null || file.getSize() == 0){ return new DwzJsonResponse("201", "请选择有效文件", "", "", "", ""); } if(!file.getOriginalFilename().endsWith(".xml")){ return new DwzJsonResponse("201", "请选择有效的xml文件", "", "", "", ""); } Document document = XMLUtil.getDocumentByFile(file); if(null != document){ Element root = document.getRootElement(); listNodes(root); return new DwzJsonResponse("200", "导入成功", "", "", "closeCurrent", ""); }else{ return new DwzJsonResponse("201", "导入失败", "", "", "", ""); } } //遍历当前节点下的所有节点 public void listNodes(Element node){ System.out.println("当前节点的名称:" + node.getName()); //如果当前节点内容不为空,则输出 if(!(node.getTextTrim().equals(""))){ System.out.println( node.getName() + ":" + node.getText()); } //同时迭代当前节点下面的所有子节点 //使用递归 Iterator<Element> iterator = node.elementIterator(); while(iterator.hasNext()){ Element e = iterator.next(); listNodes(e); } }
导入页面:<form enctype="multipart/form-data" method="post" action="xxx" class="pageForm required-validate" οnsubmit="return iframeCallback(this, dialogAjaxDone1)"> <div class="pageFormContent" layoutH="60"> <div style="padding-top: 10px;"> <label>选择xml文件:</label> <input id="file" type="file" name="file" uploaderoption="{ swf:'uploadify/scripts/uploadify.swf', uploader:'uploadify/scripts/uploadify.swf', fileTypeDesc:'*.xml', fileTypeExts:'*.xml', buttonText:'浏览', auto:true, multi:false, }" /> </div> </div> <!--底部横条---start--> <div class="formBar"> <div style="width: 550px; height: 25px;"> <ul> <li><div class="buttonActive"> <div class="buttonContent"> <button type="submit">保存</button> </div> </div></li> <li> <div class="button"> <div class="buttonContent"> <button type="button" class="close">退出</button> </div> </div> </li> </ul> </div> </div> <!--底部横条---end--> </form>