欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java解析xml文件之SAX

程序员文章站 2022-05-28 08:32:07
...

本篇博客主要使用实例讲解如何使用sax解析xml文件,不会对源码做分析。直接结合代码进行说明。
测试解析的xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<changeFileName>
    <transactionInfo>
        <detail name="sourceDirectory" value="C:\log"></detail>
        <detail name="destDirectory" value="C:\log"></detail>
        <detail name="timeSerialNumer" value="20180521"></detail>
        <detail name="indexSerialNumber" value="10"></detail>
        <detail name="databaseUser" value="zhuyuqiang"></detail>
        <detail name="tableName" value=""></detail>
        <detail name="userFileNameAsTableName" value="true"></detail>
        <detail name="userUM" value="zhuyuqiang296"></detail>
        <detail name="fileType" value=".sql"></detail>
        <detail name="splitSymbol" value="_"></detail>
    </transactionInfo>
</changeFileName>

看一下解析xml的方法:

//传入待解析的xml文件名
private static List<TransactionInfo> parserBySax(String configFile){
        SAXParserFactory factory = new SAXParserFactoryImpl();
        try {
            SAXParser parser = factory.newSAXParser();
            SaxHandler handler = new SaxHandler();
            //真正的xml解析工作有handler处理
            parser.parse(new File(configFile),handler);
            return handler.getInfos();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    private static class SaxHandler extends DefaultHandler{


        private TransactionInfo info;
        private List<TransactionInfo> infos = new ArrayList<>();

        public List<TransactionInfo> getInfos() {
            return infos;
        }

        @Override
        public void startDocument() throws SAXException {
            super.startDocument();
        }

        @Override
        public void endDocument() throws SAXException {
            super.endDocument();
        }

        //通过在方法内部对标签的名称进行判断,选在对不同的标签做不同的处理
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            super.startElement(uri, localName, qName, attributes);
            if("transactionInfo".equals(qName)){
                 info = new TransactionInfo();
            }
            if("detail".equals(qName)){
                String propertyName = attributes.getValue("name");
                String propertyValue = attributes.getValue("value");
                try {
                    populateBean(info,propertyName,propertyValue);
                } catch (NoSuchFieldException | IllegalAccessException e) {
                    log.info(e.getMessage());
                }
            }
        }
        //在标签解析结束的回调的方法中,对解析的结果进行处理
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            super.endElement(uri, localName, qName);
            if("transactionInfo".equals(qName)){
                infos.add(info);
            }
        }

        @Override
        public void characters(char[] ch, int start, int length) throws SAXException {
            super.characters(ch, start, length);
        }
    }

与DOM解析方式不同的地方在于,SAX逐行将xml的内容加载值内容中,因此没有方法同时获取xml的所有标签内容,只能按照文件内容中的顺序进行逐行解析。在SAX中,所有的标签都是用通过hadler进行处理,开发人员需要在handler的回调方法进行标签内容的处理。

打印出的解析封装后的TransactionInfo 信息如下:

[ sourceDirectory = C:\log, destDirectory = C:\log , timeSerialNumber = 20180521 , indexSerialNumber = 10 , databaseUser = zhuyuqiang , tableName = , userFileNameAsTableName = true , userUM = zhuyuqiang296 , fileType = .sql , splitSymbol = _ ]
通过打印的信息,方法已经将xml的所有信息成功解析了。