xml的解析

本文详细介绍了在Java中如何从同包、根路径和WEB-INF安全路径读取配置文件,并通过Properties类进行解析。此外,还讲解了dom4j库的常用方法,如SAXReader、selectNodes和getText,以及XPath的使用,包括语法和案例。最后,给出了几个实际操作XML文件的案例,展示了如何获取XML文档中特定元素的属性值和内容。

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

目录

一、java中配置文件的三种配置及读取方式

1、同包

2、根路径

3、WIN-INF安全路径

二、dom4j的使用

1、dom4j常用方法

三、xpath的使用

1、语法

2、案例

四、案例


 一、java中配置文件的三种配置及读取方式

1、同包

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

initPoolSize=5
maxPoolSize=20
package com.yzq.parse;

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


/**
 * 读取各个位置文件
 * @author yanzhongqi
 * 2022年6月14日 上午9:12:30
 */
public class Demo1 {
	public static void main(String[] args) throws IOException {
		//同包
		InputStream in = Demo1.class.getResourceAsStream("db.properties");
		//.properties文件有一个专门类解析
		Properties p = new Properties();
		//此时p就加载了db.properties中的所有信息
		p.load(in);
		System.out.println(p.getProperty("uname"));
		System.out.println(p.getProperty("upass"));
	}
}

运行如下:

注:Dmemo1.java和db.properties在同一个包里

2、根路径

package com.yzq.parse;

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


/**
 * 读取各个位置文件
 * @author yanzhongqi
 * 2022年6月14日 上午9:12:30
 */
public class Demo1 {
	public static void main(String[] args) throws IOException {
		//根路径
		InputStream in = Demo1.class.getResourceAsStream("/db.properties");
		//.properties文件有一个专门类解析
		Properties p = new Properties();
		//此时p就加载了db.properties中的所有信息
		p.load(in);
		System.out.println(p.getProperty("uname"));
		System.out.println(p.getProperty("upass"));
	}
}

运行如下:

注:Dmemo1.java所在的包与db.properties所在的包同级

 3、WIN-INF安全路径

package com.yzq.parse;

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("/a")
public class WebInfServlet 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 {
		//req.getRequestDispatcher("WEB-INF/a.jsp").forward(req, resp);
		//拿到servlet上下文
		InputStream in = req.getServletContext().getResourceAsStream("/WEB-INF/db.properties");
		Properties p = new Properties();
		p.load(in);
		System.out.println(p.getProperty("uname"));
		System.out.println(p.getProperty("upass"));
	}

}

 二、dom4j的使用

1、dom4j常用方法

①SAXReader:读取xml文件专用方法

②selectNodes():获取节点对象,返回的是一个List集合

③selectSingleNode():获取单个对象

④attribValue():获取指定对象的值

⑤getText():获取文本对象

<?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.yzq.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;

public class Demo2 {
	public static void main(String[] args) throws Exception {
		InputStream in = Demo2.class.getResourceAsStream("students.xml");
		SAXReader sr = new SAXReader();
		//将配置文件中的所有内容获取到了
		Document doc = sr.read(in);
		
		//selectNodes 根据标签名,返回标签
//		System.out.println(doc.asXML());
//		List<Element> studentsEles = doc.selectNodes("students");
//		System.out.println(studentsEles.size());
//		List<Element> studentEles = studentsEles.get(0).selectNodes("student");
//		System.out.println(studentEles.size());
		
		//selectNodes 根据标签名,返回单个标签,通常用于已经知晓该标签之只会出现一次
		Element studentsEl = (Element)doc.selectSingleNode("students");
		List<Element> studentEls = studentsEl.selectNodes("student");
		for (Element element : studentEls) {
			System.out.println(element.attributeValue("sid"));//attributeValue是拿到属性值
			System.out.println(element.selectSingleNode("name").getText());//getText拿到标签里的内容
		}
	}

}

运行如下:

 

 三、xpath的使用

1、语法

/代表层级 .代表查找

@代表精准定位

2、案例

<?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.yzq.parse;

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

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 Exception {
		// /代表层级 .代表查找
		// @代表精准定位
		InputStream in = Demo3.class.getResourceAsStream("students.xml");
		SAXReader sr = new SAXReader();
		Document doc = sr.read(in);
//		Element stus002 = (Element)doc.selectSingleNode("/students/student[@sid='s002']/name");
//		System.out.println(stus002.getText());
		Element studentsEle = (Element)doc.selectSingleNode("students");
		List<Element> stuEles = studentsEle.selectNodes("student");
		for (Element stuEle : stuEles) {
			if("s002".equals(stuEle.attributeValue("sid"))) {
				System.out.println(stuEle.selectSingleNode("name").getText());
			}
		}
	}
}

运行结果:

 四、案例

<?xml version="1.0" encoding="UTF-8"?>
	<!--
		config标签:可以包含0~N个action标签
	-->
<config>
	<!--
		action标签:可以饱含0~N个forward标签
		path:以/开头的字符串,并且值必须唯一 非空
		type:字符串,非空
	-->
	<action path="/regAction" type="test.RegAction">
		<!--
			forward标签:没有子标签; 
			name:字符串,同一action标签下的forward标签name值不能相同 ;
			path:以/开头的字符串
			redirect:只能是false|true,允许空,默认值为false
		-->
		<forward name="failed" path="/reg.jsp" redirect="false" />
		<forward name="success" path="/login.jsp" redirect="true" />
	</action>

	<action path="/loginAction" type="test.LoginAction">
		<forward name="failed" path="/login.jsp" redirect="false" />
		<forward name="success" path="/main.jsp" redirect="true" />
	</action>
</config>

 1、获取所有action中的type的值

package com.yzq.parse;

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

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

public class Text1 {

	public static void main(String[] args) throws Exception {
		InputStream in = Text1.class.getResourceAsStream("config.xml");
		SAXReader sr = new SAXReader();
		Document doc = sr.read(in);
		System.out.println("获取所有action中的type的值");
		Element selectSingleNode = (Element)doc.selectSingleNode("config");
		List<Element> selectNodes = selectSingleNode.selectNodes("action");
//		System.out.println(selectNodes);
		for (Element element : selectNodes) {
			System.out.println(element.attributeValue("type"));
		}
	}

}

运行如下:

  2、获取第二个action中的type的值

package com.yzq.parse;

import java.io.InputStream;

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

public class Text2 {

	public static void main(String[] args) throws Exception {
		InputStream in = Text1.class.getResourceAsStream("config.xml");
		SAXReader sr = new SAXReader();
		Document doc = sr.read(in);
		System.out.println("获取第二个action中的type的值");
		Element selectSingleNode = (Element)doc.selectSingleNode("/config/action[@path='/loginAction']");
		System.out.println(selectSingleNode.attributeValue("type"));
	}

}

运行如下:

 3、获取第二个action的所有forward的path

package com.yzq.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;

public class Text3 {

	public static void main(String[] args) throws Exception {
		InputStream in = Text1.class.getResourceAsStream("config.xml");
		SAXReader sr = new SAXReader();
		Document doc = sr.read(in);
		System.out.println("获取第二个action的所有forward的path");
		Element selectSingleNode = (Element)doc.selectSingleNode("config");
		List<Element> selectNodes = selectSingleNode.selectNodes("action[@path='/loginAction']/forward");
		for (Element element : selectNodes) {
			System.out.println(element.attributeValue("path"));
		}
	}

}

运行如下:

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

package com.yzq.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;

public class Text4 {

	public static void main(String[] args) throws DocumentException {
		InputStream in = Text1.class.getResourceAsStream("config.xml");
		SAXReader sr = new SAXReader();
		Document doc = sr.read(in);
		System.out.println("获取第二个action第二个forward的path");
		Element selectNodes = (Element)doc.selectSingleNode("/config/action[@path='/loginAction']/forward[@name='success']");
		System.out.println(selectNodes.attributeValue("path"));
	}

}

运行如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值