1.回顾:
1.什么是DTD
文档类型约束(定义)2.什么是XML
HTML
超文本标记语言
XML
可扩展标记语言
常见的两种XML文档类型约束
DTD
Schema3.什么是合法的XML
且有只有一个根节点
由开始标签和结束标签组成( 包含空标签)
严格区分大小写
正确嵌套标签4.DTD
申明
内部
<!DOCTYPE 根节点[]>
外部
<!DOCTYPE 根节点 SYSTEM "">
元素定义
语法
<!ELEMENT 元素名称 元素类型>
类型
空元素
EMPTY
文本元素
(#PCDATA)
混合元素
(e1,e2,e3,...)
限制
,
元素出现的顺序
|
多选一
?
元素出现0次或者1次(可有可无)
*
元素出现0次或者N次
+
元素出现1次或者N次
默认1次
元素出现一次
属性定义
语法
<!ATTLIST 元素名称 属性名称 属性类型 设置说明>
类型
ID
唯一、不能以/或者数字开头
CDATA
文本
ENUM
枚举、多选一。例如:(男|女|妖)
设置说明
必须
#REQUIRED
可选
#IMPLIED
转义字符
>
>
<
<
&
&
'
"
2.XML作用:
2.1配置
*.xml和*.properties、*.ini、*.yaml
2.2数据交互(获取第三方数据)
XML:webservices(axis2) -> xml -> 手机归属地、天气
JSON ajax 无刷新(比较流行)
3.Java中3种配置位置及读取方式
3.1如何使用Properties读取配置文件
1)*.properties文件以键值对的方式存储数据;
2)使用Properties类读取配置文件;
package com.zking.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class Demo {
public static void main(String[] args) throws IOException {
//1获取文件输入流
InputStream is = Demo.class.getResourceAsStream("demo.properties");
//2创建Properties对象
Properties p=new Properties();
//3加载文件
p.load(is);
//4读取配置文件
String name=p.getProperty("username");
System.out.println(name);
//String password=p.getProperty("username");
//System.out.println(password);
//如果没有属性,则默认赋值。
String password=p.getProperty("pass", "vfdvdf");
System.out.println(password);
}
}
demo.properties:
username=lt
password=1234
3.2 配置位置
//1)存放于根目录下,/代表获取src根目录的绝对路径
InputStream is = Demo2.class.getResourceAsStream("/demo2.xml");
System.out.println(is);
//2)存放于同一类的包下,不加/代表同类名包下的相对路径;
InputStream is1 = Demo2.class.getResourceAsStream("demo.properties");
System.out.println(is1);
//3)存放于WEB-INF目录下
4.dom4j+xpath解析xml文件
1)xpath类似数据库中的select语句;
2)Document有节点(Node)组成:元素节点、属性、文本等;
3)selectNodes()获取节点下所有子节点;
4)selectSingleNodes()获取单个节点信息;
5) xpath语法:/(定位路径)、@(获取属性)
代码示例(解析student.xml):
package com.zking.util;
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) {
//1获取student.xml文件输入流
InputStream is = Demo3.class.getResourceAsStream("student.xml");
//2创建SAXReader对象
SAXReader sax=new SAXReader();
// 3读取文件输入流,并转换成Document对象
try {
Document doc=sax.read(is);
//4循环遍历
// 1)selectNodes:获取多个节点,返回list
// 2)selectSingleNode:获取单个节点
// 3)xpath语法:/代表定位路径
List<Node> list = doc.selectNodes("/students/student");
for (Node node : list) {
//5将Node节点转换成元素Element(student)
Element elem=(Element) node;
//6获取元素节点的属性
String pid=elem.attributeValue("pid");
System.out.println(pid);
//7获取student 节点下的name节点
Node namenode=elem.selectSingleNode("name");
System.out.println(namenode.getText());
}
//简化:xpath语法!!!!
Node node1 = doc.selectSingleNode("/students/student[@pid='p02']/name");
System.out.println(node1.getText());
} catch (Exception e) {
e.printStackTrace();
// TODO Auto-generated catch block
}
// Document 包含元素节点,包含属性以及文本
}
}
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>