XML文件解析-DOM4J方式和SAX方式
阿新 • • 發佈:2017-09-09
public bsp input main saxparser exception element rac default
最近遇到的工作內容都是和xml內容解析相關的.
1圖片數據以base64編碼的方式保存在xml的一個標簽中,xml文件通過接口的方式發送給我,然後我去解析出圖片數據,對圖片進行進一步處理.
2.xml內容保存在blob字段中,然後jdbc讀取blob字段獲取xml內容進行解析.
解析的方法挺簡單的,網上有很多種,主要有SAX,DOM4J等.
先來揭曉一下DOM4J是如何解析xml文件的,話不多少,直接上碼.
/** * 獲取xml文件絕對路徑 */ private String getFilePath() { String fileName = "test.xml"; String filePath= System.getProperty("user.dir").replace("\\", "/") return filePath+"/"+fileName; }
/** * 解析獲取xml節點數據 */ private Map<String,String> parseXml(String filePath) { File xmlFile = new File(filepath); SAXReader reader = new SAXReader(); Map<String,String> paramMap = newHashMap<String,String>(); try { Document document = reader.read(xmlFile); Element rootElement = document.getRootElement(); Element nameElement = rootElement.element("name"); String name = nameElement.getText(); paramMap.put("name",name); Element telElement = rootElement.element("tel"); String tel = telElement.getText(); paramMap.put("tel",tel); Element addressElement = rootElement.element("address"); String address = addressElement.getText(); paramMap.put("address",address); } catch (Exception e) { logger.error("解析xml文件出錯", e); } return paramMap; }
解析的xml文檔如下
<?xml version="1.0" encoding="UTF-8"?> <RootElement> <name>黑天鵝</name> <tel>12345678</tel> <address>反脆弱訓練基地</address> </RootElement>
然後我們揭曉一下SAX是如何進行xml解析的,直接上碼.
/** * xml文件內容解析 * * @param fileName * @return map * @throws Exception */ public Map<String, String> parseXmlContent(byte[] fileContent) { Map<String, String> dataMap = new HashMap<String, String>(); if (fileContent.length <= 0) { logger.error("獲取文件流出錯,文件流為空"); return null; } try { ByteArrayInputStream input = new ByteArrayInputStream(fileContent); SAXParserFactory parsefactory = SAXParserFactory.newInstance(); SAXParser parser = parsefactory.newSAXParser(); SAXParseHandler parseHandler = new SAXParseHandler(); parser.parse(input, new SAXParseHandler()); dataMap = parseHandler.getXmlMap(); } catch (Exception e) { System.out.println(e); logger.error("xml文件解析錯誤", e); return null; } return dataMap; }
SAX自定義一個解析類.
class SAXParseHandler extends DefaultHandler { private static Map<String, String> map; private String tagName; private StringBuilder sb; public void startDocument() throws SAXException { super.startDocument(); map = new HashMap<String, String>(); } public void endDocument() throws SAXException { super.endDocument(); } /** * 獲取文檔屬性,內容,執行多次 */ public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { super.startElement(uri, localName, qName, attributes); //在此可以獲取標簽屬性內容 this.tagName = qName; sb = new StringBuilder(); } /** * 獲取標簽值,執行多次 */ public void endElement(String uri, String localName, String qName) throws SAXException { String data = sb.toString(); if (StringUtils.isNotBlank(tagName)) { switch (tagName) { case "name": map.put("name", data); break; case "tel": map.put("tel", data); break; case "address": map.put("address", data); break; default: break; } } } public Map<String, String> getXmlMap() { return map; } /** * 獲取整個文檔數據 */ public void characters(char[] ch, int start, int length) throws SAXException { sb.append(new String(ch, start, length)); }
測試主方法(開發時候用的,按需調試即可)
public static void main(String[] args) throws IOException { File file = new File("F:\\test.xml"); FileInputStream input = new FileInputStream(file); ByteArrayOutputStream output = new ByteArrayOutputStream(); byte[] bt = new byte[1024]; int n; while((n = input.read(bt)) != -1){ output.write(bt, 0, n); } input.close(); output.close(); byte[] filebyte = output.toByteArray(); XmlParser par = new XmlParser(); Map<String, String> dataMap = par.parseXmlContent(filebyte); System.out.println(dataMap); }
在解析xml的時候遇到了很多奇葩坑,用戶標簽不規範,發過來的數據沒有標簽的,還有發過來空文件的,真真夠了.
尤其在解析blob字段中的xml內容數據時,也存在一些坑,到時候解決了在更新.
XML文件解析-DOM4J方式和SAX方式