如何使用java自带的SAX工具类解析XML文件转换为Document对象

如何使用java自带的SAX工具类解析XML文件转换为Document对象
1. 获取需要解析的XML文件java
//根据xml路径获取该inputStream输入对象
InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(path);
InputSource inputSource = new InputSource(inputStream);

待解析的xml文件路径如下:

在这里插入图片描述

待解析的xml文件具体内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<users>
    <user email="www.baidu.com">
        <name>张三</name>
        <age>22</age>
        <sex></sex>
    </user>
    <user>
        <name>李四</name>
        <age>11</age>
        <sex></sex>
    </user>
    <user>
        <name>王五麻子</name>
        <age>10</age>
        <sex>不明</sex>
    </user>
</users>
2. 获取DocumentBuilderFactory
  • 创建 DocumentBuilderFactory 对象

    //创建DocumentBuilderFactory
    DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
    
  • 设置对象 DocumentBuilderFactory 是否需要校验xml格式

    //设置是否需要验证xml
    documentBuilderFactory.setValidating(true);
    
  • 设置对象 DocumentBuilderFactory 是否需要校验命名空间

    //设置是否需要校验xml命名空间
    documentBuilderFactory.setNamespaceAware(true);
    
3. 获取DocumentBuilder
  • 创建 DocumentBuilder 对象

    //创建DocumentBuilder对象
    DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
    
  • 设置 DocumentBuilder 对象的entityResolver属性,解析符合entityResolver规定的xml

    //设置entityResolver,只解析entityResolver指定的xml
    documentBuilder.setEntityResolver(new CustomerResolver());
    

    自定义的entityResolver类的定义如下:

    private static class CustomerResolver implements EntityResolver {
        @Override
        public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
            System.out.println("publicId:" + publicId);
            System.out.println("systemId:" + systemId);
            if (systemId.equals("")) {
                System.out.println("Resolving Entity...");
                return null;
            } else {
                // use the default behaviour
                return null;
            }
        }
    }
    
  • 设置 DocumentBuilder 对象解析过程中的异常处理类

    //设置errhandler
    documentBuilder.setErrorHandler(new CustomerErrorHandler());
    

    自定义的异常处理类定义如下:

    private static class CustomerErrorHandler implements ErrorHandler {
    
        @Override
        public void warning(SAXParseException exception) throws SAXException {
            System.out.println("SAXParseException warning:"+exception);
        }
    
        @Override
        public void error(SAXParseException exception) throws SAXException {
            System.out.println("SAXParseException error:"+exception);
        }
    
        @Override
        public void fatalError(SAXParseException exception) throws SAXException {
            System.out.println("SAXParseException fatalError:"+exception);
        }
    }
    
4. 使用parse()方法把XML解析成Document
//解析x'm'l
Document document = documentBuilder.parse(inputSource);
5. 解析Document对象中的节点信息

​ 具体解析逻辑如下:

/**
 *  解析document对象
 */
public static void parseDocument(Document document) {
    Element element = document.getDocumentElement();
    NodeList childNodes = element.getChildNodes();
    for (int i = 0; i < childNodes.getLength(); i++) {
        Node nodes = childNodes.item(i);
        if (nodes.getNodeType() == Node.ELEMENT_NODE) {
            NamedNodeMap attributes = nodes.getAttributes();
            Node node1 = attributes.getNamedItem("email");
            if(node1 != null)
                System.out.println(node1.getTextContent());

            //循环子节点
            NodeList childNodes1 = nodes.getChildNodes();
            for (int j = 0; j < childNodes1.getLength(); j++) {
                Node item = childNodes1.item(j);
                if (item.getNodeType() == Node.ELEMENT_NODE) {
                    if (item.getNodeName().equals("name")) {
                        //xml 回车空格和文本都会算一个node
                        String name2 = item.getFirstChild().getNodeValue();
                        System.out.println(name2);
                    }
                }
            }
            NodeList age = document.getElementsByTagName("age");
            for (int g = 0; g < age.getLength(); g++) {
                Node item = age.item(g);
                String st = item.getFirstChild().getNodeValue();
                System.out.println(st);
            }
        }
        System.out.println(element.getNamespaceURI());
    }
}
6.具体的代码内容
public class apptest {
    public static void main(String[] args) throws Exception {
        Document document = xmlReader("ceshi/a.xml");
        parseDocument(document);
    }

    /**
     *  使用DocumentBuilderFactory 输出xml的docment树机构对象
     * @return
     */
    public static Document xmlReader(String path) throws Exception {
        //根据xml路径获取该inputStream输入对象
        InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(path);
        InputSource inputSource = new InputSource(inputStream);
        //创建DocumentBuilderFactory
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        //设置是否需要验证xml
        documentBuilderFactory.setValidating(true);
        //设置是否需要校验xml命名空间
        documentBuilderFactory.setNamespaceAware(true);
        //创建DocumentBuilder对象
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
        //设置entityResolver,只解析entityResolver指定的xml
        documentBuilder.setEntityResolver(new CustomerResolver());
        //设置errhandler
        documentBuilder.setErrorHandler(new CustomerErrorHandler());
        //解析x'm'l
        Document document = documentBuilder.parse(inputSource);
        return document;
    }

    /**
     *  解析document对象
     */
    public static void parseDocument(Document document) {
        Element element = document.getDocumentElement();
        NodeList childNodes = element.getChildNodes();
        for (int i = 0; i < childNodes.getLength(); i++) {
            Node nodes = childNodes.item(i);
            if (nodes.getNodeType() == Node.ELEMENT_NODE) {
                NamedNodeMap attributes = nodes.getAttributes();
                Node node1 = attributes.getNamedItem("email");
                if(node1 != null)
                    System.out.println(node1.getTextContent());

                //循环子节点
                NodeList childNodes1 = nodes.getChildNodes();
                for (int j = 0; j < childNodes1.getLength(); j++) {
                    Node item = childNodes1.item(j);
                    if (item.getNodeType() == Node.ELEMENT_NODE) {
                        if (item.getNodeName().equals("name")) {
                            //xml 回车空格和文本都会算一个node
                            String name2 = item.getFirstChild().getNodeValue();
                            System.out.println(name2);
                        }
                    }
                }
                NodeList age = document.getElementsByTagName("age");
                for (int g = 0; g < age.getLength(); g++) {
                    Node item = age.item(g);
                    String st = item.getFirstChild().getNodeValue();
                    System.out.println(st);
                }
            }
            System.out.println(element.getNamespaceURI());
        }
    }

    private static class CustomerResolver implements EntityResolver {
        @Override
        public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
            System.out.println("publicId:" + publicId);
            System.out.println("systemId:" + systemId);
            if (systemId.equals("")) {
                System.out.println("Resolving Entity...");
                return null;
            } else {
                // use the default behaviour
                return null;
            }
        }
    }

    private static class CustomerErrorHandler implements ErrorHandler {

        @Override
        public void warning(SAXParseException exception) throws SAXException {
            System.out.println("SAXParseException warning:"+exception);
        }

        @Override
        public void error(SAXParseException exception) throws SAXException {
            System.out.println("SAXParseException error:"+exception);
        }

        @Override
        public void fatalError(SAXParseException exception) throws SAXException {
            System.out.println("SAXParseException fatalError:"+exception);
        }
    }
}
7.解析结果展示

其中上面两条信息自定义异常处理类检测到信息打印,下面的输出都是对应xml中的各个节点信息。

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值