解析XML文件
1.XML的作用:
配置和数据的交互(获取第三方数据)
Properties类解析properties文件
2.JAVA中的properties文件的3种配置位置及读取方式:
1>如何使用properties读取配置文件:
>使用特点:
以键值对的形式存储数据
>使用Properties类读取配置文件
3. properties文件的配置位置:
例:
config.properties文件:(中文会被自动处理,用#注释)
name=张三
sex=男
age=20
1>存放于根目录下,/代表获取src根目录的绝对路径
例:
//找到读取文件
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");
String age = pro.getProperty("age");
System.out.println("name="+name+"sex="+sex+"age="+age);
} catch (IOException e) {
e.printStackTrace();
}
2>存放于同一类包下,不加/代表同类名包下的相对路径
同上,不过要去掉/
3>存放于WEB-INF目录下
例:
//设置编码
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//获取上下文本对象
ServletContext sc = this.getServletContext();
//找到文件
InputStream is = sc.getResourceAsStream("/WEB-INF/config.properties");
//创建properties对象,读取并输出
Properties pro = new Properties();
try {
pro.load(is);
String name = pro.getProperty("name");
String sex = pro.getProperty("sex");
String age = pro.getProperty("age");
System.out.println("name="+name+"sex="+sex+"age="+age);
} catch (Exception e) {
e.printStackTrace();
}
}
4.dom4j+xpath解析xml文件:
1>xpath类似数据库中的select语句
2>Document由节点(Node)组成(元素节点,属性,文本等)
3>selectNodes():获取节点下所有的子节点
4>selectSingleNode():获取单个节点的信息
5>xpath语法:
/:定位路径
@:获取指定属性
例:
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>
解析Demo类:
//加载文件输入流
InputStream iss = Demo.class.getResourceAsStream("/Student.xml");
//创建SAXReader对象
SAXReader read = new SAXReader();
try {
//加载XML文件输入流,并返回document对象
Document doc = read.read(iss);
//document由节点(Node)组成:元素节点,属性,文本等
//获取节点的方式
//1>selectNodes():获取所有的节点对象
//2>selectSingleNode():获取单个节点对象
//xpath语法: /(定位路径),@(获取属性)
List<Node> list = doc.selectNodes("/students/student");
//遍历/students/student下的元素节点
for (Node node : list) {
//node==student元素节点
Element elem = getElement(node);
//获取当前student元素节点的属性
String pid = elem.attributeValue("pid");
System.out.println("pid="+pid);
//获取student下的子节点元素,只有一个
Element elemName = (Element)elem.selectSingleNode("name");
String nameText = elemName.getText();
System.out.println("name元素的值:"+nameText);
}
System.out.println("-----------------------");
//获取指定的student节点下的name的文本值
Element elem1 = (Element) doc.selectSingleNode("/students/student[@pid='p02']");
String nameValue = (String)elem1.selectSingleNode("name").getText();
System.out.println(nameValue);
System.out.println("--------------------");
//简化
String elem2 = (String) doc.selectSingleNode("/students/student[@pid='p02']/name").getText();
System.out.println(elem2);
} catch (DocumentException e) {
e.printStackTrace();
}
}
//获取元素
public static Element getElement(Node node) {
Element elem = (Element)node;
return elem;
}