一.XML的作用
1.配置或者数据传输
一般有两种类型都可以达到这样的效果:.xml和.properties
2.存储数据
二.JAVA中三种配置位置及读取方式
1.使用properties读取配置文件
1).properties文件是以键值对方式存储数据
2)使用properties类读取配置文件
2.配置位置
1)存放在根目录下的, / 代表获取根目录src下的绝对路径
2)存放于同一类包下,不加 / 代表同类包名下的相对路径
3)存放在WEB-INF下的,代码自行了解一下
ServletContext sc=this.getServletContext();
InputStream is=sc.getResourceAsStream("/WEB-INF/db.properties");
案例:
注意先自行配置config.properties文件
//以输入流的形式读取properties文件
InputStream is = Demo.class.getResourceAsStream("/config.properties");
//创建properties属性文件类
Properties pro=new Properties();
//加载properties文件
try {
pro.load(is);
//根据键key获取指定的value值
String name = pro.getProperty("name");
String sex = pro.getProperty("sex");
System.out.println("name="+name+",sex="+sex);
} catch (IOException e) {
e.printStackTrace();
}
三.dom4j+xpath解析xml文件
我们直接看案例
先配置student.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student pid="p01">
<name>张三</name>
</student>
<student pid="p02">
<name>李四</name>
</student>
<student pid="p03">
<name>王五</name>
</student>
</students>
然后看实现解析的过程
//加载文件输入流
InputStream is = Demo.class.getResourceAsStream("/student.xml");
//创建SAXReader对象
SAXReader saxread=new SAXReader();
try {
//加载xml文件输入流,并返回document对象
Document doc = saxread.read(is);
//Document有节点(Node)组成:元素节点、属性、文本等;
/**
* 获取节点的方式:
* 1.selectNodes();获取所有的节点对象
* 2.selectSingleNode();获取单个节点对象
*/
//xpath语法:/(定位路径)、@(获取属性)
List<Node> nodes = doc.selectNodes("/students/student");
//循环遍历/students/student元素节点
for (Node node : nodes) {
//node==student元素节点
// System.out.println(node);
Element elem=(Element)node;
//获取当前student元素节点的值
String pid = elem.attributeValue("pid");
//获取节点student的属性值
System.out.println("pid="+pid);
//获取student下的子节点元素,因为只有一个,所有使用 selectSingleNode()的方法
Element ename = (Element)elem.selectSingleNode("name");
//获取文本值
String name = ename.getText();
System.out.println("name="+name);
}
System.out.println("-----------------");
//获取指定的student节点下的name的文本
Node single2 = doc.selectSingleNode("/students/student[@pid='p02']");
//获取指定节点下的指定节点
Element ename2=(Element)single2.selectSingleNode("name");
//获取子节点的文本值
String text=ename2.getText();
System.out.println("-----待优化:"+text);
System.out.println("----------------------------------------");
//直接在获取节点时,指定到要要获取的节点
Node name2 = doc.selectSingleNode("/students/student[@pid='p02']/name");
//直接输出获取文本值
System.out.println("优化后,指定2号名称为:"+name2.getText());
} catch (DocumentException e) {
e.printStackTrace();
}