xml配置文件解析详谈

前言

关于xml的解析,在早前的博文已经写过了,这次给大家带来更详细的2.0版本
之前的链接

xml文件和properties配置文件解析的方式

对于xml文件来说,现在主要作配置文件去配置信息使用,现在给大家看一下它的解析过程:

Properties文件解析:
文件内容:

uname=mybatis_ssm
upass=xiaoli

解析demo:

package com.dawnx;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class Demo1 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
        //获取配置文件路径
		InputStream in = Demo1.class.getResourceAsStream("db.properties");
		//实例化properties
		Properties p = new Properties();
		//读取配置文件信息
		p.load(in);
		System.out.println(p.getProperty("uname"));
		System.out.println(p.getProperty("upass"));
	}

}

结果:

mybatis_ssm
xiaoli

这里的properties文件在同一包下
在这里插入图片描述
如果是不同包,在src下的配置文件,则需要在获取资源时加个/

 //获取配置文件路径
		InputStream in = Demo1.class.getResourceAsStream("/db.properties");

上面是properties文件的解析,下面看dom4j解析xml文件:
xml内容:

<?xml version="1.0" encoding="UTF-8"?>
<students>
	<student sid="s001">
		<name>小明</name>
	</student>
	<student sid="s002">
		<name>小芳</name>
	</student>
	<student sid='s003'>
		<name>小王</name>
	</student>
</students>

demo:

package com.dawnx;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Properties;

import org.apache.jasper.tagplugins.jstl.core.ForEach;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

public class Demo3 {

	public static void main(String[] args) throws IOException, DocumentException {
		// TODO Auto-generated method stub
		//加载配置文件
		InputStream in = Demo3.class.getResourceAsStream("/students.xml");
		//实例化dom4j对象
		SAXReader r=new SAXReader();
		//读取信息流
		Document d = r.read(in);
		//dom4j读取元素节点
		List<Element> list = d.selectNodes("/students/student");
		//遍历节点集合
		for (Element el : list) {
			//获取元素节点属性值是否为指定值,如果是,获取姓名输出
			if("s002".equals(el.attributeValue("sid"))) {
				Node n =(Node)el.selectSingleNode("name");
				System.out.println("sid="+el.attributeValue("sid")+",name="+n.getText());
			}
		}
	}

}

结果:

sid=s002,name=小芳

这里解析的是src下面的xml,同properties解析一样,如果是同一包下,不用加/,否则需要…

dom4j+xpath:

package com.dawnx;

import java.io.InputStream;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

public abstract class Demo4 {

	public static void main(String[] args) throws DocumentException {
		//读取信息
		InputStream in = Demo4.class.getResourceAsStream("/students.xml");
		//实例化dom4j
		SAXReader read=new SAXReader();
		//读取信息流
		Document doc = read.read(in);
		//用xpath找指定元素节点属性
		Element node =(Element)doc.selectSingleNode("/students/student[@sid='s002']");
		Element ele =(Element)node.selectSingleNode("name");
		System.out.println("sid="+node.attributeValue("sid")+",name="+ele.getText());
		
	}
	
}

结果:

sid=s002,name=小芳

大家可以看到,dom4j+xpath解析相对于dom4j解析来说,要减少点代码,原因就是xpath可以获取指定元素节点的指定属性,也就是这行代码:

Element node =(Element)doc.selectSingleNode("/students/student[@sid='s002']");

dom4j+xpath的结合使用,可以更灵活和方便
web.inf下的xml文件的解析:

package com.dawnx;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name="demo",urlPatterns="/demo")
public class DemoServlet extends HttpServlet{

	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(req, resp);
	}
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//获取上下文
		ServletContext context = req.getServletContext();
		//加载资源
		InputStream in = context.getResourceAsStream("/WEB-INF/db.properties");
		Properties p = new Properties();
		//读取信息流
		p.load(in);
		System.out.println(p.getProperty("uname"));
		System.out.println(p.getProperty("upass"));
	}
}

在这里插入图片描述


结果:

mybatis_ssm
xiaoli

在使用解析的时候,一定要注意的细节地方就是路径问题,同包不用加/,配置文件在src下,一定要加!!!

尾言

最后有问题欢迎大家指出,溜了溜了…

猜你喜欢

转载自blog.csdn.net/qq_45510899/article/details/106270344
今日推荐