dom4j解析xml檔案 或者xml格式字串
阿新 • • 發佈:2019-02-01
主要記錄的是專案中遇到的解析xml報文 獲取指定資料的方法,怕以後會忘,記錄一下
導包:dom4j(版本根據需要,不會造成相容錯誤就可以)
主要思路:利用遞迴的形式,解析xml檔案,首先附錄遞迴的方法,因為要求是需要把抓取到的資料放到指定檔案,並且現在只是一個demo形式,所以用了FileWriter的相關方法,還不盡完善,有需要改善的地方希望大家留言...
/** * 解析任意xml節點的方法 */ public static void resolveNode (Element node,FileWriter writer) throws IOException { //如果是thedata標籤 ,抓取屬性value值 if ("TheData".equalsIgnoreCase(node.getName())) { //輸出當前節點名 writer.write("\r\n"); writer.write("------------------\r\n"); writer.write("當前節點:" + node.getName() + "\r\n"); //遍歷當前節點所有的屬性值,抓取value屬性的值 List<Attribute> attributes = node.attributes(); for (Attribute a : attributes) { if ("value".equalsIgnoreCase(a.getName())) { writer.write("屬性:" + a.getName() + ",值:"+ a.getValue() + "\r\n"); } } } //獲取所有的子節點,並遞迴此方法 Iterator<Element> iterator = node.elementIterator(); while (iterator.hasNext()) { Element e = iterator.next(); resolveNode(e,writer); } }
建立file檔案的方法:
public static String createFile (String fileName) { //獲取FileWriter,寫入檔案 String result = ""; File directory = new File("."); String path = null; try { path = directory.getCanonicalPath(); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("獲取當前路徑時出錯"); } path += "\\" + fileName; logger.info("path = " + path); File file = new File (path); if(file.exists()) { logger.info("建立單個檔案" + path + "失敗,目標檔案早已存在!"); return path; } if (path.endsWith(File.separator)) { logger.error("建立單個檔案" + path + "失敗,目標檔案不能為目錄!"); return result; } //判斷目標檔案所在的目錄是否存在 if(!file.getParentFile().exists()) { //如果目標檔案所在的目錄不存在,則建立父目錄 System.out.println("目標檔案所在目錄不存在,準備建立它!"); if(!file.getParentFile().mkdirs()) { logger.error("建立目標檔案所在目錄失敗!"); return result; } } //建立目標檔案 try { if (file.createNewFile()) { logger.info("建立單個檔案" + path + "成功!"); return path; } else { logger.error("建立單個檔案" + path + "失敗!"); return result; } } catch (IOException e) { e.printStackTrace(); logger.error("建立單個檔案" + path + "失敗!" + e.getMessage()); return result; } }
主方法:
@RequestMapping("/resolveXML.do") @ResponseBody public ControllerResult ResolveXmlMethod (@RequestBody String xmlStr) { /*//讀取xml檔案的方法 SAXReader reader = new SAXReader(); Document document = reader.read(new File("檔案路徑"));*/ ControllerResult result = new ControllerResult(); logger.info("xmlStr=" + xmlStr); //解析xml字串 Document doc = null; try { doc = DocumentHelper.parseText(xmlStr); } catch (DocumentException e) { e.printStackTrace(); result.setIsSuccess(false); result.setMsg("字串轉換xml格式出錯"); return result; } //獲取根節點 Element root = doc.getRootElement(); //建立輸出目錄 String filePath = createFile("log.txt"); if (filePath == null || "".equals(filePath.trim())) { result.setIsSuccess(false); result.setMsg("建立輸出目標檔案失敗"); return result; } FileWriter writer = null; try { writer = new FileWriter(filePath, true); writer.write("\r\n"); writer.write("\r\n"); writer.write("\r\n"); writer.write("#################\r\n"); //遍歷指定節點和她下面所有的子節點,並寫入指定檔案 resolveNode(root,writer); } catch (IOException e) { e.printStackTrace(); result.setIsSuccess(false); result.setMsg("建立寫檔案器失敗"); return result; } finally { try { if(writer != null){ writer.close(); } } catch (IOException e) { e.printStackTrace(); } } result.setIsSuccess(true); return result; }
-------------------------------------------------------------------------------------END---------------------------------------------------------------------------------------