1. 程式人生 > >dom4j解析xml檔案 或者xml格式字串

dom4j解析xml檔案 或者xml格式字串

  主要記錄的是專案中遇到的解析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---------------------------------------------------------------------------------------