XML解析

XML解析

前言:xml–Extendsible Markup Language,扩展性标识语言,文件的后缀名通常为.xml、.properties、.ini(已淘汰),能用来做数据交互(已淘汰)和软件的配置,本文详细介绍了在java中如何使用dom4j解析配置文件。

一、配置文件的三种存放位置及对应读取方式

1、存放位置

1.1、src根目录下。可在src根目录下建一个source folder(注意一定要是source folder,若是普通的folder则会在解析时出现问题),这里命名为configuration,再将配置文件放进此文件夹中,以便于区分
src根目录下的配置文件

1.2、读取配置文件的类的包下
与读取配置文件的类同包的配置文件

1.3、WEB-INF或其子目录下
WEB-INF下的配置文件

2、读取方式

2.1、src根目录下:

当前类名.class.getResourceAsStream("/配置文件名");

2.2、读取配置文件的类的包下:

当前类名.class.getResourceAsStream("配置文件名");

2.3、WEB-INF或其子目录下:因WEB-INF为安全目录,故需要先获取上下文

ServletContext context = this.getServletContext();
context.getResourceAsStream("/WEB-INF/配置文件名");

3、所需jar包

dom4j、jaxen
在这里插入图片描述

二、案例演示

1、案例文件

db.properties

students.xml

2、解析.properties文件

2.1、src根目录下

package com.guyong;

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

/**
 * 读取src根目录下的配置文件
 * @author Guyong
 *
 * 2020年5月20日上午10:56:06
 */
public class Demo1 {
	
	public static void main(String[] args) throws IOException {
		//加载资源文件,转为流对象
		InputStream in = Demo1.class.getResourceAsStream("/db.properties");
		//使用工具类加载流
		Properties p = new Properties();
		p.load(in);
		//输出打印
		System.out.println(p.getProperty("uname"));
		System.out.println(p.getProperty("upass"));
	}
	
}

控制台打印结果
在这里插入图片描述

2.2、与读取配置文件的类同包

package com.guyong;

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

/**
 * 读取同包下的配置文件
 * @author Guyong
 *
 * 2020年5月20日上午11:11:52
 */
public class Demo2 {
	
	public static void main(String[] args) throws IOException {
		//加载资源文件,转为流对象
		InputStream in = Demo2.class.getResourceAsStream("db.properties");
		//使用工具类加载流
		Properties p = new Properties();
		p.load(in);
		//输出打印
		System.out.println(p.getProperty("uname"));
		System.out.println(p.getProperty("upass"));
	}
	
}

控制台打印结果
在这里插入图片描述

2.3、WEB-INF或其子目录下

package com.guyong;

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="demo3", urlPatterns="/demo")

/**
 * 读取WEB-INF或其子目录下的配置文件
 * @author Guyong
 *
 * 2020年5月20日上午11:15:18
 */
public class Demo3 extends HttpServlet {
	
	private static final long serialVersionUID = 7297062805599438694L;
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		this.doPost(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//WEB-INF为安全目录,需要先获取上下文
		ServletContext context = this.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"));
	}
	
}

控制台打印结果
在这里插入图片描述

3、解析.xml文件

3.1、dom4j解析

package com.guyong;

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

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

/**
 * dom4j+Xpath解析XML
 * @author Guyong
 *
 * 2020年5月20日上午11:24:44
 */
public class Demo4 {
	
	public static void main(String[] args) throws DocumentException {
		//获取到资源文件转为流对象
		InputStream in = Demo4.class.getResourceAsStream("/students.xml");
		//解析得到所有student标签
		SAXReader reader = new SAXReader();
		Document doc = reader.read(in);
		@SuppressWarnings("unchecked")
		List<Element> list = doc.selectNodes("/students/student");
		//遍历得到所有标签内容
		for (Element e : list) {
			//判断
			if("s002".equals(e.attributeValue("sid"))) {
				Element name = (Element) e.selectSingleNode("name");
				System.out.println("sid:"+e.attributeValue("sid"));
				System.out.println("name:"+name.getText());
			}
		}
	}
	
}

控制台打印结果
在这里插入图片描述

3.2、dom4j+xpath解析

package com.guyong;

import java.io.InputStream;

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

/**
 * 
 * @author Guyong
 *
 * 2020年5月21日上午8:30:12
 */
public class Demo5 {
	
	public static void main(String[] args) throws DocumentException {
		//加载资源文件转为流对象
		InputStream in = Demo5.class.getResourceAsStream("/students.xml");
		//使用工具类解析
		SAXReader reader = new SAXReader();
		Document doc = reader.read(in);
		//根据xpath找到对应student节点
		Element stuEle = (Element) doc.selectSingleNode("/students/student[@sid='s002']");
		//进一步查找name节点
		Element nameEle = (Element) stuEle.selectSingleNode("name");
		//输出打印
		System.out.println(stuEle.attributeValue("sid"));
		System.out.println(nameEle.getText());
	}
	
}

控制台打印结果
在这里插入图片描述

三、总结

.properties文件是一个属性对应一个键这样的键值对模式,结构更简单,使用java.util.Properties工具类进行解析;
.xml文件则是树状结构,结构更清晰,使用org.dom4j.io.SAXReader工具类进行解析。

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读