DOM4J解析xml文件
一、引入DOM4J的Maven依赖
dom4j依赖jaxen,要完成xml的解析,这两个坐标都需要导入。
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>jaxen</groupId>
<artifactId>jaxen</artifactId>
<version>1.1.1</version>
</dependency>
如果是高版本的dom4j的话只引入以下坐标即可。
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.0.0</version>
</dependency>
二、编写测试代码解析xml文件
这是测试用的userDao.xml文件
<?xml version="1.0" encoding="utf-8" ?>
<mapper namespace = "com.test.dao.UserDao">
<select id = "selectList" parameterType = "java.lang.String" resultType = "com.test.pojo.User">
select * from t_user where id = #{id};
</select>
</mapper>
用Java代码解析此xml文件(如需复制粘贴的话注意要解析的xml文件名为userDao.xml,文件路径是src/main/resources/userDao.xml)
public void test2()throws Exception{
//命名空间接口名
String interfaceName = null;
//select标签id值
String idValue = null;
//select标签参数值
String parameterVal = null;
//select标签返回值类型
String retType = null;
//select标签的sql值
String sql = null;
//使用缓冲流读取配置文件,获取根节点
Element rootElement = new SAXReader().read(new BufferedReader(new InputStreamReader(new FileInputStream("src/main/resources/userDao.xml")))).getRootElement();
String namespace = rootElement.attribute(0).getName();
//如果是命名空间,取出类的全限定名
if("namespace".equals(namespace)){
interfaceName = rootElement.attribute(0).getValue();
}
Iterator<Element> rootIterator = rootElement.elementIterator();
while (rootIterator.hasNext()) {
Element element = rootIterator.next();
String elementName = element.getName();
//如果是select标签就给id,param,resultType赋值
if("select".equals(elementName)){
//将标签体内容赋值给sql
sql = element.getStringValue().trim();
//获取select标签属性集合
List<Attribute> attributes = element.attributes();
for (Attribute attribute : attributes) {
//获取属性名
String attributeName = attribute.getName();
if("id".equals(attributeName)){
idValue = interfaceName + "." + attribute.getValue();
}
if("parameterType".equals(attributeName)){
parameterVal = attribute.getValue();
}
if("resultType".equals(attributeName)){
retType = attribute.getValue();
}
}
}
}
System.out.println("命名空间接口名:" + interfaceName);
System.out.println("id值:" + idValue);
System.out.println("参数类型:" + parameterVal);
System.out.println("返回值类型:" + retType);
System.out.println("sql语句:" + sql);
}
运行结果如下:
三、对DOM4J部分方法使用的简要说明
- SAXReader类的read()方法:读取要解析的xml文件,此方法需要传的参数可以是java.io.File也可以是java.io.InputStream,还可以是java.io.Reader本文中使用的是传递InputStream的实现类.
- Element类是标签(包含标签体和属性以及属性值)
- Element类的attribute()方法可以传递一个索引,当只有一个标签(不包含子标签)的时候,index为0是就代表是自身标签,attribute()方法的返回值是Attribute类型,这个类型是表示标签中的属性以及属性值
- Attribute类中的getName()方法是获取标签的属性名,getValue()方法是获取标签的属性值
- Element类中的attributes()方法返回值是一个List集合,存储的是Attribute类型的引用,这个方法适用于标签中的属性值为多个时使用
- Element类中的elementIterator()方法的返回值是一个遍历其子节点的迭代器(和集合迭代器一样)
- Element类中的getStringValue()方法是获取标签体的内容,比如示例代码中获取的sql语句。