Xml(eXtendsible markup language)可扩展的标记语言
作用:
1.用来保存数据(少量)
2.配置文件
3.数据传输载体(和json作用一样)
代码示例:
stus.xml
<?xml version="1.0" encoding="UTF-8"?>
<stus>
<stu>
<name>a</name>
<age>18</age>
</stu>
<stu>
<name>b</name>
<age>28</age>
</stu>
</stus>
结构分析:
standalone : no - 该文档会依赖关联其他文档 , yes-- 这是一个独立的文档
<?xml version="1.0" encoding="gbk" standalone="no" ?>
默认文件保存的时候,使用的是GBK的编码保存
为了通用,建议使用UTF-8编码保存,以及encoding 都是 utf-8
XML 命名规则
XML 元素必须遵循以下命名规则:
名称可以含字母、数字以及其他的字符
名称不能以数字或者标点符号开始
名称不能以字符 “xml”(或者 XML、Xml)开始
名称不能包含空格
命名尽量简单,做到见名知义
非法字符:
严格地讲,在 XML 中仅有字符 “<“和”&” 是非法的。省略号、引号和大于号是合法的,但是把它们替换为实体引用是个好的习惯。
< <
& &
如果某段字符串里面有过多的字符, 并且里面包含了类似标签或者关键字的这种文字,不想让xml的解析器去解析。 那么可以使用CDATA
不过CDATA 一般比较少看到。 通常在服务器给客户端返回数据的时候。
XML 解析:
就是获取元素里面的字符数据或者属性数据。
主要方式有两种:1.DOM 2.SAX
使用比较广泛的API是dom4j
Dom4j 基本用法:
element.element(“stu”) : 返回该元素下的第一个stu元素
element.elements(); 返回该元素下的所有子元素。
SAX用法:
- 创建SaxReader对象
- 指定解析的xml
- 获取根元素。
- 根据根元素获取子元素或者下面的子孙元素
try {
//1. 创建sax读取对象
SAXReader reader = new SAXReader(); //jdbc -- classloader
//2. 指定解析的xml源
Document document = reader.read(new File("src/xml/stus.xml"));
//3. 得到元素、
//得到根元素
Element rootElement= document.getRootElement();
//获取根元素下面的子元素 age
//rootElement.element("age")
//System.out.println(rootElement.element("stu").element("age").getText());
//获取根元素下面的所有子元素 。 stu元素
List<Element> elements = rootElement.elements();
//遍历所有的stu元素
for (Element element : elements) {
//获取stu元素下面的name元素
String name = element.element("name").getText();
String age = element.element("age").getText();
String address = element.element("address").getText();
System.out.println("name="+name+"==age+"+age+"==address="+address);
}
} catch (Exception e) {
e.printStackTrace();
}
Dom4j 的 Xpath使用:
dom4j里面支持Xpath的写法。 xpath其实是xml的路径语言,支持我们在解析xml的时候,能够快速的定位到具体的某一个元素。
- 添加jar包依赖
jaxen-1.1-beta-6.jar - 在查找指定节点的时候,根据XPath语法规则来查找
- 后续的代码与以前的解析代码一样。
//要想使用Xpath, 还得添加支持的jar 获取的是第一个 只返回一个。
Element nameElement = (Element) rootElement.selectSingleNode("//name");
System.out.println(nameElement.getText());
System.out.println("----------------");
//获取文档里面的所有name元素
List<Element> list = rootElement.selectNodes("//name");
for (Element element : list) {
System.out.println(element.getText());
}
XML 约束:
在element里面加上id来确保唯一性
xml文档里面直接嵌入DTD的约束法则
<!ELEMENT stus (stu)> : stus 下面有一个元素 stu , 但是只有一个
<!ELEMENT stu (name , age)> stu下面有两个元素 name ,age 顺序必须name-age
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ATTLIST stu id CDATA #IMPLIED> stu有一个属性 文本类型, 该属性可有可无
元素的个数:
+ 一个或多个
* 零个或多个
? 零个或一个
属性的类型定义
CDATA : 属性是普通文字
ID : 属性的值必须唯一
<!ELEMENT stu (name , age)> 按照顺序来
<!ELEMENT stu (name | age)> 两个中只能包含一个子元素
Schema
其实就是一个xml , 使用xml的语法规则, xml解析器解析起来比较方便 , 是为了替代DTD 。但是Schema 约束文本内容比DTD的内容还要多。 所以目前也没有真正意义上的替代DTD
一个xml 可以引用多个schema约束。 但是只能引用一个DTD约束。