XML解析

1、java种配置文件的三种配置位置和相对应的读取方式:

1.1常见的两种配置文件:xml和*.properties(属性文件)
1.2常见的三种存放位置以及对应的读取方式(properties文件为例):
配置文件内容:
在这里插入图片描述

①存放src根目录下:
在这里插入图片描述
读取代码:

package com.songwanxi.XML;

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

public class Demo1 {
public static void main(String[] args) throws Exception {
	//读取src根目录下存放的配置文件 配置文件名前需要加 /
	InputStream in = Demo1.class.getResourceAsStream("/db.properties");
	 Properties p = new Properties();
	 //将读取到的配置文件对应的流对象交给properties对象进行管理
	 p.load(in);
	 System.out.println(p.getProperty("uname"));
	 System.out.println(p.getProperty("upass"));
	 //打印对应键名的值
}
}

输出:
在这里插入图片描述

②与读取配置文件的类在同一包(同一级)
在这里插入图片描述
读取代码:

package com.songwanxi.XML;

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

public class Demo2 {
public static void main(String[] args) throws Exception {
//读取配置文件的类在同一包(同一级)
		InputStream in = Demo2.class.getResourceAsStream("db.properties");
		 Properties p = new Properties();
		 //将读取到的配置文件对应的流对象交给properties对象进行管理
		 p.load(in);
		 System.out.println(p.getProperty("uname"));
		 System.out.println(p.getProperty("upass"));
		 //打印对应键名的值
}
}

结果:
在这里插入图片描述
③WEB-INF(或者在其子目录下)
由于WEB-INF是安全目录,外部无法直接访问到其内部文件,所以需要改变方法使用上下文来获取
在这里插入图片描述
读取代码:

package com.songwanxi.XML;

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

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("/demo")
public class Demo3Servlet 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
		//读取WEN-INF安全目录下的配置文件 通过声明上下文来获取
	InputStream in = req.getServletContext().getResourceAsStream("/WEB-INF/db.properties");
	Properties p = new Properties();
	//将读取的配置文件对应的流对象交给Properties进行管理
	    p.load(in);
	    System.out.println(p.getProperty("uname"));
	    System.out.println(p.getProperty("upass"));
	    req.getRequestDispatcher("demo.jsp").forward(req, resp);
	    }
}

结果:

在这里插入图片描述
注(了解一下):*.properties文件
key=value
#注释

Properties.load(is)

bin 放命令的
config 放tomcat服务配置的
work 临时文件
webapp 发布项目的目录
web-inf
安全目录 含义:不能被外界访问
log 日志

2、XML文件的读取

根据文件存在的位置来取的方法是跟properties文件一样的
注:properties文件的解析方式有java.util.properties这个类来完成
XML文件应该有一个工具类来完成:
jdk/jdom
sax解析 由上往下解析 (移动端用的比较多)
dom4j解析 由外到内解析(目前最火的解析方式)
首先展示XML文件的内容:
在这里插入图片描述
如果我们要读取XML文件可以采用dom4j 解析XML文件,需要先导入两个jar包
在这里插入图片描述
接着,我们开始解析:

package com.songwanxi.XML;

import java.io.InputStream;

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

public class Demo4 {
public static void main(String[] args) throws Exception {
	//找到XML文件
	InputStream in = Demo4.class.getResourceAsStream("/students.xml");
	SAXReader red = new SAXReader();
	//将配置文件加载到内存中(由dom4j创建的对象完成)
	Document doc = red.read(in);
	System.out.println(doc.asXML());
}
}

结果:
在这里插入图片描述
如果我只想拿到XML文件中sid为002的小芳呢?
dom4j+xpath方法:
第一种:

package com.songwanxi.XML;

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;

public class Demo4 {
public static void main(String[] args) throws Exception {
	//找到XML文件
	InputStream in = Demo4.class.getResourceAsStream("/students.xml");
	SAXReader red = new SAXReader();
	//将配置文件加载到内存中(由dom4j创建的对象完成)
	Document doc = red.read(in);
	//System.out.println(doc.asXML());
	
	//xpath拿到xml中的小芳 按照查找目录的方式去查找XML内容
	//students/student/name
	//注意:Element 是dom4j中的
	//查到所有
	List<Element> stuEles = doc.selectNodes("/students/student");
	//遍历
	for (Element stuEle : stuEles) {
		//System.out.println(stuEle.asXML());//获取/students/student该目录下的所有
		//获取sid的属性值为s002的 
		if("s002".equals(stuEle.attributeValue("sid"))) {
		Element nameEle = (Element) stuEle.selectSingleNode("name");//获取name标签
		//System.out.println(nameEle.asXML());
		//获取标签内部的文本内容
		System.out.println(nameEle.getText());
		}
	}
}
}

在这里插入图片描述
第二种:

//第二种:xpath直接定位 sid=s002
	Element stuEle = (Element) doc.selectSingleNode("/students/student[@sid='s002']");
	//System.out.println(stuEle.asXML());
	Element nameEle = (Element) stuEle.selectSingleNode("name");//获取name标签
	System.out.println(nameEle.getText());//获取标签内部的文本内容

结果:
在这里插入图片描述
比起第一种,第二种明显更加方便。

一个案例: config.xml解析:

在这里插入图片描述
1、获取所有action中的type的值

package com.songwanxi.XML;

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;

public class Test {
public static void main(String[] args) throws Exception {
	//找到XML文件
		InputStream in = Demo4.class.getResourceAsStream("config.xml");
		SAXReader red = new SAXReader();
		Document doc = red.read(in);
		
		//1、获取所有action中的type的值
		List<Element> actEle = doc.selectNodes("/config/action");
		for (Element act : actEle) {
			System.out.println("获取所有action中的type的值:"+act.attributeValue("type"));
		}
}
}

结果:
在这里插入图片描述
2、获取第二个action中的type的值

package com.songwanxi.XML;

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;

public class Test {
public static void main(String[] args) throws Exception {
	//找到XML文件
		InputStream in = Demo4.class.getResourceAsStream("config.xml");
		SAXReader red = new SAXReader();
		Document doc = red.read(in);
		
//		2、获取第二个action中的type的值
		List<Element> actEle2 = doc.selectNodes("/config/action[@path='/loginAction']");
		for (Element act2 : actEle2) {
			System.out.println("获取第二个action中的type的值:"+act2.attributeValue("type"));
		}
		
}
}

结果:
在这里插入图片描述
3、获取第二个action的所有forward的path

package com.songwanxi.XML;

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;

public class Test {
public static void main(String[] args) throws Exception {
	//找到XML文件
		InputStream in = Demo4.class.getResourceAsStream("config.xml");
		SAXReader red = new SAXReader();
		Document doc = red.read(in);
		
		
//		3、获取第二个action的所有forward的path
		List<Element> actEle3 = doc.selectNodes("/config/action[@path='/loginAction']/forward");
		for (Element act3 : actEle3) {
			System.out.println("获取第二个action的所有forward的path:"+act3.attributeValue("path"));
		}
}
}

结果:
在这里插入图片描述

4、获取第二个action的第二个forward的path

package com.songwanxi.XML;

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;

public class Test {
public static void main(String[] args) throws Exception {
	//找到XML文件
		InputStream in = Demo4.class.getResourceAsStream("config.xml");
		SAXReader red = new SAXReader();
		Document doc = red.read(in);
		
	
//		4、获取第二个action的第二个forward的path
		List<Element> actEle4 = doc.selectNodes("/config/action[@path='/loginAction']/forward[@name='success']");
		for (Element act4 : actEle4) {
			System.out.println("获取第二个action的第二个forward的path:"+act4.attributeValue("path"));
		}
		
}
}

结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值