导出导入xml的实现

项目中需要用到导出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

扫描二维码关注公众号,回复: 2970706 查看本文章

读取文件。

核心代码:

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" onsubmit="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>


 
 


猜你喜欢

转载自blog.csdn.net/heweimingming/article/details/75108567