XML解析配置文件以及练习

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

1.读取同级目录下的配置文件
(读取存放在src根目录下db.properties)
在这里插入图片描述
db.properties,内容有

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

这里写Demo1.java来读取

package wxm; 
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
 /**读取同级目录下的配置文件 *  
 * @author 2019071003 * 
*/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(p.getProperty("uname"));	
		System.out.println(p.getProperty("maxPoolSize"));}				}

结果如下在这里插入图片描述
结果一致
2与读取配置文件的类在同一包.如图(读取conf下面db.properties)在这里插入图片描述
写一个Demo2.java来读取,如下

package wxm; 
import java.io.IOException;import java.io.InputStream;
import java.util.Properties; 
/**读取项目根目录下的配置文件 *
  * @author 2019071003 * 
 * */
  * 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("maxPoolSize"));
	}			
		}

结果:对应内容成功
在这里插入图片描述
对比:错误示范,没有在文件名前加/
在这里插入图片描述

Test2.class.getResourceAsStream("/db.properties");这里的/若是没有就会报错(空指针异常,找不到文件

3 WEB-INF(或其子目录下)(读取WEB-INF里面的db.properties)*

在这里插入图片描述
注意!!!
在这里插入图片描述

WEB-INF是安全目录,不能被外界访问然后我们的办法是

package wxm; 
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;
 /** 获取web-inf下的配置文件db.properties 
 * @author 2019071003 *
 */
    @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();//创建管理对象(!!!空指针-一般是这里为空->一般去检查一下文件是否在web-info的根目录下)	//将读取的配置文件对应的流对象交给Properties进行管理	
          p.load(in);	
         System.out.println(p.getProperty("uname"));
  	System.out.println(p.getProperty("upass"));			}} 
  	

在这里插入图片描述

XML的作用

3.dom4j+xpath解析xml文件(重点

3.1写好students.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>

3.2导入2个jar包
在这里插入图片描述
写一个来读取`test.java
案例1:
获取到小芳

第一种方法:

先得到所有的student元素

 package 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; 
  /** 
  *讲解如何解析xml从中获取我们想要得到的内容 
  * xml解析技术: dom4j、sax解析、jdom解析
  * 重点是dom4j,后两种已经慢慢被淘汰 例如:我需要获取到小芳 
  * @author 2019071003 
  * */
  public class Test {
  public static void main(String[] args) throws Exception {	
  InputStream in=Test.class.getResourceAsStream("students.xml");	
  SAXReader reader=new SAXReader();//dom4j	//将配置文件xml内容加载到内存中
  	Document doc= reader.read(in);//注意  导包为dom4j的,抛出异常	
  	//System.out.println(doc.asXML());	
//例如:我需要获取到小芳。运行如下代码:	//第一种方法:	//1. 先得到所有的student元素	List<Element> stus=doc.selectNodes("students/student");//得到所有的student的元素	
for (Element e : stus) {		
System.out.println(e.asXML());	
}
}
}  

效果一致
在这里插入图片描述
案例2:
判断是否是sid=“s002”,并得到sid=“s002”内的元素, 如下代码:

package 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; 
  /** *3..获取标签内的文本内容,代码如下:
   * @author 2019071003 *
   * /
   * public class Test2 {
   * public static void main(String[] args) throws Exception {
  
  InputStream in=Test2.class.getResourceAsStream("students.xml");	
  SAXReader reader=new SAXReader();//dom4j	//将配置文件xml内容加载到内存中
  	Document doc= reader.read(in);//注意  导包为dom4j的,抛出异常	
  	List<Element> stus=doc.selectNodes("students/student");//得到所有的student的元素
  		for (Element e : stus) {		//System.out.println(e.asXML());		
  		if("s002".equals(e.attributeValue("sid"))) {//得到每个sid的内容			
  		Element name=(Element) e.selectSingleNode("name");//得到002的元素name		    // System.out.println(name.asXML());			System.out.println(name.getText());		}					
  		}
  		}
  		}

效果:
在这里插入图片描述
第二种方法

代码:

package 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; /
** * 第二种方法 *2.判断是否是sid=“s002”,并得到sid=“s002”内的元素, 如下代码:
 * @author 2019071003 
 * */public class Test3 {public static void main(String[] args) throws Exception {
 * 	InputStream in=Test3.class.getResourceAsStream("students.xml");	
 * SAXReader reader=new SAXReader();//dom4j	//将配置文件xml内容加载到内存中
 * 	Document doc= reader.read(in);//注意  导包为dom4j的,抛出异常
 * 	Element stuEle002=(Element) doc.selectSingleNode("students/student[@sid='s002']");	
 * Element nameEle=(Element) stuEle002.selectSingleNode("name");	
 * System.out.println(nameEle.getText());	
 * }
 * }

在这里插入图片描述
作业:config.xml解析
1、获取所有action中的type的值
2、获取第二个action中的type的值
3、获取第二个action的所有forward的path
4、获取第二个action的第二个forward的path

package 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; 
/**   document.selectNodes(xpath);//查一组  
 document.selectSingleNode(xpath);//查单个   
 作业:config.xml解析  
  1、获取所有action中的type的值   
  2、获取第二个action中的type的值  
  3、获取第二个action的所有forward的path 
  4、获取第二个action的第二个forward的path 
     * @author 2019071003
     *  */public class Test5 {public static void main(String[] args) throws Exception {	
     * InputStream in=Test5.class.getResourceAsStream("config.xml");	
     * SAXReader reader=new SAXReader();//dom4j	//将配置文件xml内容加载到内存中
     * 	Document doc= reader.read(in);//注意  导包为dom4j的,抛出异常	 //1、获取所有action中的type的值 
     *   List<Element> stuEles=doc.selectNodes("/config/action");   
     * for (Element e : stuEles) {	   //1、获取所有action中的type的值
     * 	     System.out.println("1、获取所有action中的type的值"+e.attributeValue("type"));	
     *        //2.获取第二个action中的type	
     *       if("/loginAction".equals(e.attributeValue("path"))) {		
     *     System.out.println("2.获取第二个action中的type:"+e.attributeValue("type"));	}   }  
     *     //3、获取第二个action的所有forward的path   
     * List<Element>  stuEle2=doc.selectNodes("/config/action[@type='test.LoginAction']/forward");
     *  for (Element e : stuEle2) {	
     *       System.out.println("3、获取第二个action的所有forward的path"+e.attributeValue("path"));	
     * // 4、获取第二个action的第二个forward的path	
     *        if("success".equals(e.attributeValue("name"))) {		
     *         System.out.println("4、获取第二个action的第二个forward的path"+e.attributeValue("path"));		
     *  	 
     * }}
     * }} 

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值