一.介绍
我们经常会将一些配置和信息放入到一些外部文件中,例如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();
}
}
-关注我,持续更新高质量文章