Java基础篇-解析xml文件

一.介绍

  我们经常会将一些配置和信息放入到一些外部文件中,例如xml、properties文件。当我们在业务代码中获取这些信息,就要学会如何去解析。

所以接下来我分享一种我常用的解析xml文件的一种方法,这个方法也是Mybatis中解析xml文件的主要手段

二.分析

如下是我们配置的外部文件(起名mybatis-config-datasource.xml),它的路径在resources中


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

    <mappers>
        <mapper resource="mapper/User_Mapper.xml"/>
    </mappers>

</configuration>

接下来,我们进行解析

1.首先我一般将xml文件转换成字节流

将一个外部资源转换成字节流的方法通常有两种,一种类和类加载器方式调用getResourceAsStream方法,这个很好用,也是我常用的。

两种方式的本质区别在于,类加载器调用的getResourceAsStream中的参数是相对于resource包的路径;类调用的getResourceAsStream中的参数是相对于类的路径

InputStream resourceAsStream = ApiTest.class.getClassLoader().getResourceAsStream("mybatis-config-datasource.xml");
InputStream resourceAsStream = ApiTest.class.getResourceAsStream("/mybatis-config-datasource.xml");

这样就获得了字节流对象啦

2.再将字节流转换成字符流

通过一个构造器就搞定啦,InputStreamReader这个类就可以字节流对象直接转换成字符流对象

      Reader resourceAsReader = new InputStreamReader(resourceAsStream);

获得字符流对象

3.使用SaxReader类读取字符流并封装到一个文件类对象中(document)

获得字符流之后,我们就不得不引入SaxReader啦,作用是使用SAX解析器读取XML文件并将其转换为DOM对象模型。它可以遍历XML文档的节点树,访问和操作各个节点及其属性值,并支持XPath表达式查询

它本身常用读文件的方法read,简单介绍一下

通过多种方式对xml文件进行解析,new File()的方式、new inputSource等,返回的一个Document对象。

inputSource:

inputSource:XML实体的单个输入源 此类允许SAX应用程序在单个对象中封装有关的输入源信息,以下是封装字符源信息

Document:

用于文本的容器。

//采用 new File()的方式
Document document = saxReader.read(new File("/Users/xx/IdeaProjects/sg-small-mybatis/sg-small-mybatis-03/src/test/resources/mybatis-config-datasource.xml"));

//采用 new InputSource() 的方式
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(new InputSource(resource));

//采用 inputStream的方式
InputStream inStream = 。。。;
Document document = saxReader.read(inStream);

4.通过document中的方法获取xml文件中的信息

这里有很多的方法,可以获得xml的信息

比如getRootElement(),获得xml文件中的头标签,例如前面xml中的configuration

返回就是一个标签对象。

通过这个标签对象获得其他子标签的信息

element():参数:当前标签下的子标签的名 ;  返回:标签对象
elements():参数:标签下的子标签的名:返回:标签对象数组

attributeValue():参数:当前标签中的属性名);返回属性

等等还有好多方法,可以自行去查阅官方文档

完整的操作一下,以上面的xml为例

public void SAXReaderTest() throws IOException {
        InputStream resourceAsStream = ApiTest.class.getClassLoader().getResourceAsStream("mybatis-config-datasource.xml");
        Reader resourceAsReader = new InputStreamReader(resourceAsStream);
        //Reader resourceAsReader = Resources.getResourceAsReader("mybatis-config-datasource.xml");
        SAXReader saxReader = new SAXReader();
        try {
            //Document document = saxReader.read(new File("/Users/cps/IdeaProjects/sg-small-mybatis/sg-small-mybatis-03/src/test/resources/mybatis-config-datasource.xml"));
            Document document = saxReader.read(new InputSource(resourceAsReader));
            System.out.println(document);//org.dom4j.tree.DefaultDocument@641147d0 [Document: name null]
            Element rootElement = document.getRootElement();
            System.out.println(rootElement);//org.dom4j.tree.DefaultElement@6e38921c [Element: <configuration attributes: []/>]
            Element mappers = rootElement.element("mappers");
            System.out.println(mappers);//org.dom4j.tree.DefaultElement@64d7f7e0 [Element: <mappers attributes: []/>]
            Element mapper = mappers.element("mapper");
            System.out.println(mapper);//org.dom4j.tree.DefaultElement@27c6e487 [Element: <mapper attributes: [org.dom4j.tree.DefaultAttribute@49070868 [Attribute: name resource value "mapper/User_Mapper.xml"]]/>]
            String resource = mapper.attributeValue("resource");
            System.out.println(resource);//mapper/User_Mapper.xml


        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

-关注我,持续更新高质量文章

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值