XML:解析(三种配置读取)

XML:解析

Java中配置文件的三种配置位置及读取方式
1、用Properties解析文件,读取同级目录下的配置文件

db.properties里的内容

uname=mybatis_ssm
upass=xiaoli

同一级别读取
节流读取代码:

package com.DZY.xmL;

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

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

打印结果:

uname=mybatis_ssm
upass=xiaoli

2、用Properties解析文件,读取类型是文本时。

1.如果在txt中不考虑中文的话,用字节流可以。
2.如果在txt中需要考虑中文就要用字符流; BufferedReader br=new BufferedReader(new InputStreamReader(in));
因为用字节流读取中午就会乱码。

public class Demo1 {
 public static void main(String[] args) throws Exception {
 //读取同级目录下的配置文件
  InputStream  in=  Demo1.class.getResourceAsStream("asd.txt");//读取文件类型(.txt)
  BufferedReader   br=new  BufferedReader(new  InputStreamReader(in));
  Properties   p=new  Properties();
  //将读取的配置文件对应的流对象交给Properties进行管理
    p.load(br);
  String  uname=p.getProperty("uname");
     String  upass=p.getProperty("upass");
     System.out.println("uname="+uname);
     System.out.println("upass="+upass);
     }      
}

字符流打印结果:

uname=你好
upass=123

db.properties之前是放在同一个包下com.DZY.xml,现在更换到了conf。
但是两个包在src下:
XML:解析(三种配置读取)_第1张图片现在调用db.properties里面的值:
代码如下:

package com.DZY.xmL;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
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);
  String  uname=p.getProperty("uname");
     String  upass=p.getProperty("upass");
     System.out.println("uname="+uname);
     System.out.println("upass="+upass);
}      
}

打印结果:

uname=mybatis_ssm
upass=xiaoli

2、在WEB-INF中读取文件里的值;

1、WEB-INF不能随便读取值,他是配置插件和XML文件。
2、WEB-INF他是web项目里的安全目录。

所以我们不能直接访问里面的jsp文件,
但可以用代码访问:

package com.DZY.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("/demo1")
public class DemoServlet 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 {
           //获取web-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("demo1.jsp").forward(req, resp);  
  }
}

打印结果:

mybatis_ssm
xiaoli

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

Properties含义和特点:
https://blog.csdn.net/T_angsonglin/article/details/90490059

3、XML的解析和读取

这是我要读取的xml



 
  小明
 
 
  小芳
 
 
  小王
 

案例1:
xpath 八爪鱼 按照查找目录的方式去查找xml内容

package com.DZY.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 Demo2 {
      public static void main(String[] args) throws Exception {
     // students.xml
    InputStream in = Demo2.class.getResourceAsStream("students.xml");
    SAXReader reader = new SAXReader();
//    // 将配置文件xml内容加载进内存
    Document doc = reader.read(in);
//     System.out.println(doc.asXML());
    //  八爪鱼 按照查找目录的方式去查找xml内容
    // /students/student/name
    List stuEles = doc.selectNodes("/students/student");
    for (Element stuEle : stuEles) {
//      System.out.println(stuEle.asXML());
     // 获取sid的属性值与s002进行对比,如果是那么就取出name标签对应的值
     if ("s002".equals(stuEle.attributeValue("sid"))) {
      Element nameEle = (Element) stuEle.selectSingleNode("name");
       System.out.println(nameEle.asXML());//第一个打印
      // 获取标签内部的文本类容
      System.out.println(nameEle.getText());//第二个打印
     }
    }
 }
} 

打印结果

小芳
小芳

案例二

package com.DZY.xmL;

import java.io.InputStream;

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

public class Demo3 {
     public static void main(String[] args) throws Exception {
//      获取到xml文件,将其转化成流对象
      InputStream in= Demo3.class.getResourceAsStream("students.xml");
//      实列化一个SAXReader
         SAXReader s=new SAXReader();
//      使用dom4j的SAXReader来读取流
         Document doc = s.read(in);
        // System.out.println(doc.asXML());        
         Element stuS002Ele = (Element) doc.selectSingleNode("/students/student[@sid='s002']/name");
         System.out.println(stuS002Ele.asXML());//第一个打印
         System.out.println(stuS002Ele.getName());//第二 个打印
         System.out.println(stuS002Ele.getText()); //第三个打印
     } 
 }

打印结果

小芳
name
小芳

作业:
解析XML的文件:


 

 
 
  
  
  
 
 
  
  
 

读取代码:

package com.DZY.xmL;

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;
/** 
 * 1、获取所有action中的type的值
   2、获取第二个action中的type的值
   3、获取第二个action的所有forward的path
   4、获取第二个action的第二个forward的path
 * @author Aromanic150
 *
 */
public class Demo4 {
      public static void main(String[] args) throws Exception {
    InputStream in = Demo4.class.getResourceAsStream("config.xml");
    SAXReader reader = new SAXReader();
    Document doc = reader.read(in);
//    1、获取所有action中的type的值
    List stuElems = doc.selectNodes("/config/action");
    for (Element stuEle : stuElems) {
     String type = stuEle.attributeValue("type");
     System.out.println(type);
    } 
////     2、获取第二个action中的type的值
    List stuElems2 = doc.selectNodes("/config/action[@path='/loginAction']");
    for (Node node : stuElems2) {
     Element a= (Element) node;
              String type=a.attributeValue("type");
              System.out.println(type);
    }
////    3、获取第二个action的所有forward的path
    List stuElems3 = doc.selectNodes("/config/action[@type='test.LoginAction']/forward");
    for (Node node : stuElems3) {
     Element a= (Element) node;
              String path=a.attributeValue("path");
              System.out.println(path);
    }
////     4、获取第二个action的第二个forward的path
          List stuElems4 = doc.selectNodes("/config/action[@type='test.LoginAction']/forward[@name='success']");
      for (Node node : stuElems4) {
     Element a= (Element) node;
              String path=a.attributeValue("path");
              System.out.println(path);
    }
   }
 }

打印结果:

test.RegAction
test.LoginAction
test.LoginAction
/login.jsp
/main.jsp
/main.jsp

学而不止,学而不尽
XML其他解析方法和模式
https://blog.csdn.net/wuyu92877/article/details/78490147

你可能感兴趣的:(xml)