XML解析

博客介绍了Java中配置文件的三种配置位置及读取方式,包括src根目录下、与读取类同一包、WEB - INF目录下。还讲述了XML文件的读取方法,如使用jdk/jdom、sax、dom4j等解析方式,以及xpath解析xml文件,最后布置了config.xml解析作业。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                     XML解析

一:Java中配置文件的三种配置位置及读取方式

1.1 XML和*.properties(属性文件)
1.2 存放位置
1.2.1 src根目录下

 Xxx.class.getResourceAsStream("/config.properties");

如图
在这里插入图片描述
这是在src的根目录
以下db.properties配置文件自定义代码(只声明一次)

uname=mybatis_ssm
upass=xiaoli
url=jdbc:mysql://localhost:3306/mybatis_ssm
class=com.mysql.jdbc.Driver

initPoolSize=5
maxPoolSize=20

读取代码如下:

package com.xwt.parse;

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("uname:"+p.getProperty("uname"));
		System.out.println("upass:"+p.getProperty("upass"));
		System.out.println("class:"+p.getProperty("class"));	
	}
}

运行图为下图
在这里插入图片描述 1.2.2 与读取配置文件的类在同一包

        Xxx.class.getResourceAsStream("config2.properties");

同一级别

在这里插入图片描述
提示:db.properties文件在上面已声明
代码如下:

package com.xwt.parse;

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

/**
 * 读取同级目录下的配置文件
 *
 */

public class Demo1 {
	public static void main(String[] args) throws Exception {
		//读取同级目录下的配置文件
		InputStream in=Demo1.class.getResourceAsStream("db.properties");
		Properties p=new Properties();
		//将读取的配置文件对应的流对象交给Properties
		p.load(in);
		System.out.println("uname:"+p.getProperty("uname"));
		System.out.println("upass:"+p.getProperty("upass"));
	}
}

在这里插入图片描述
如下图:同是src根目录下但是未加/则会报空指针异常
在这里插入图片描述
1.2.3 WEB-INF(或其子目录下)

   ServletContext application = this.getServletContext();
	  InputStream is = application.getResourceAsStream("/WEB-INF/config3.properties");

WEB-INF是服务器的安全目录
a.把案例文件放入WEB-INF演示
b.创建DemoServlet.java
c.把项目加入,配置,运行
如图
在这里插入图片描述
代码如下:

package com.xwt.parse;

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

import javax.jws.WebService;
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("/demo3")
public class DemoServlet extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPost(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//获取web-inf下的配置文件
		InputStream in=req.getServletContext().getResourceAsStream("/WEB-INF/db.properties");
		Properties p=new Properties();
		//将读取的配置文件对应的流对象交给Properties
		p.load(in);
		System.out.println("uname:"+p.getProperty("uname"));
		System.out.println("upass:"+p.getProperty("upass"));
		System.out.println("class:"+p.getProperty("class"));
	}
}

运行结果如下:
在这里插入图片描述

二:XML文件的读取

1.根据文件存在的位置来取的方法是跟properties文件一样的
注:properties文件的解析方式有java.util.properties这个类来完成
2.XML文件应该有一个工具类来完成:
jdk/jdom
sax解析 由上往下解析 (移动端用的比较多)
dom4j解析 由外到内解析
dom4j(代替) ——> sax解析 jdom解析(落后)
dom4j+xpath解析xml文件
3. xpath等同数据库的select语句
document.selectNodes(xpath);//查一组
document.selectSingleNode(xpath);//查单个
首先操作:
导入外部jar包
在这里插入图片描述

再展示studentsxml文件的内容:

<?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>

得到小芳的名字第一种路径代码如下:

package com.xwt.parse;

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

import javax.xml.transform.sax.SAXResult;

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

/**
 * 如何解析xml  获取其中想要得到的内容
 * xml解析技术:
 *           dom4j(代替) ——> sax解析  jdom解析(落后)
 *
 */

public class Demo4 {
	public static void main(String[] args) throws Exception {
		//students.xml
		InputStream in=Demo4.class.getResourceAsStream("students.xml");
		SAXReader reader=new SAXReader();
		//将配置文件xml内容加载进内存
		Document doc=reader.read(in);
		//System.out.println(doc.asXML());
		
		//xpath  八爪鱼  按照查找目录的方式查找xml内容
		List<Element> stu=doc.selectNodes("/students/student");
		for (Element s : stu) {
			//System.out.println(s.asXML());
			//获取sid的属性值与s002进行对比  如果是那么就取出name标签对应的值
			if("s002".equals(s.attributeValue("sid"))) {
				Element name=(Element) s.selectSingleNode("name");
				//System.out.println(name.asXML());
				//获取标签内部的文本类容
				System.out.println("名字:"+name.getText());
			}
		}
	}
}

在这里插入图片描述得到小芳的名字第第二种属性代码如下:

package com.xwt.parse;

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

import javax.xml.transform.sax.SAXResult;

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

/**
 * 如何解析xml  获取其中想要得到的内容
 * xml解析技术:
 *           dom4j(代替) ——> sax解析  jdom解析(落后)
 *
 */

public class Demo5 {
	public static void main(String[] args) throws Exception {
		//students.xml
		InputStream in=Demo5.class.getResourceAsStream("students.xml");
		SAXReader reader=new SAXReader();
		//将配置文件xml内容加载进内存
		Document doc=reader.read(in);
		Element stu=(Element) doc.selectSingleNode("/students/student[@sid='s002']");
		//System.out.println(stu.asXML());
		Element name=(Element) stu.selectSingleNode("name");
        System.out.println("名字:"+name.getText());
	}

}

在这里插入图片描述

作业:config.xml解析

1、获取所有action中的type的值
2、获取第二个action中的type的值
3、获取第二个action的所有forward的path
4、获取第二个action的第二个forward的path
代码如下:

package com.xwt.parse;

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;

/**
 * 作业:config.xml解析 1、获取所有action中的type的值 2、获取第二个action中的type的值
 * 3、获取第二个action的所有forward的path 4、获取第二个action的第二个forward的path
 *
 * @author 婉婷宝贝
 *
 */

public class HomeWork {
	public static void main(String[] args) throws Exception {
		// config.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("作业1:获取所有action中的type的值:" + act.attributeValue("type"));
		}

		// 作业2:获取第二个action中的type的值
		List<Element> actEle2 = doc.selectNodes("/config/action[@path='/loginAction']");
		for (Element act2 : actEle2) {
			System.out.println("作业2:获取第二个action中的type的值:" + act2.attributeValue("type"));
		}

		// 作业3:获取第二个action的所有forward的path
		List<Element> actEle3 = doc.selectNodes("/config/action[@path='/loginAction']/forward");
		for (Element act3 : actEle3) {
			System.out.println("作业3:获取第二个action的所有forward的path:" + act3.attributeValue("path"));
		}

		// 作业4:获取第二个action的第二个forward的path
		List<Element> actEle4 = doc.selectNodes("/config/action[@path='/loginAction']/forward[@name='b']");
		for (Element act4 : actEle4) {
			System.out.println("作业4:获取第二个action的第二个forward的path:"+act4.attributeValue("path"));
		}
	}
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值