1. 程式人生 > >XML文件解析-DOM4J方式和SAX方式

XML文件解析-DOM4J方式和SAX方式

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 = new
HashMap<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方式