1. 静态资源:实现写好的文档
html,css,javaScript,JQuery
2. 动态资源:文档事先不存在,内容是通过代码来动态生成的
Servlet/JSP
3. JCBC:通过Java程序访问数据库
4. B/S架构和C/S架构:
a. B/S:浏览器/服务器
通过浏览器访问服务器的应用
优点:打开就用
缺点:展示效果受限,发送接收的数据较多
b. C/S:客户端/服务器
通过客户端访问服务器的应用
优点:展示效果好,发送接收的数据较少
缺点:需要下载客户端
**标记语言:不止存储文本内容,也存文本相关的其他信息
**可扩展:用户可以自己指定在xml使用的标签
一. xml概述
1.1.xml是什么?
Extensible Markup Language 可扩展标记语言。
标记语言:不止存储文本内容,也存储和内容相关的其他信息
W3C 1998 1.0
xml是一种数据存储格式, 本质上就是一段字符串。
xml是如何来保存数据的?
xml中允许用户自定义标签, 标签分为开始标签和结束标签。开始标签和结束标签之间可以嵌套其他的标签。
正是利用标签来保存数据, 利用标签之间嵌套关系来保存数据之间的层级关系。
1.2.xml的应用场景
(1)传输数据
由于xml本质上是一段字符串, 具有跨平台的特性, 因此可以在不同系统之间进行数据交换。
(2)用作配置文件
由于xml可以保存有结构的数据, 因此xml常被用来用作应用程序的配置文件。
1.3.xml文件
编写一个xml文件
1.4.xml校验
校验xml文件
二. 语法
2.1.文档声明
用来声明当前xml基本属性信息的, 解析器会根据文档声明来决定如何解析xml文件。
注意:
一个xml文件必须包含且只能包含一个文档声明。
文档声明必须放在xml文件的第一行,前面不能有任何内容。
如果一个xml文件没有包含文档声明, 则该xml是一个不符合规范的xml文件。
写法:
<?xml version="1.0"?>
version用来声明当前xml所遵循的xml规范, 目前就是1.0
<?xml version="1.0" encoding="UTF-8"?>
encoding用来声明当前xml所使用的字符集编码, xml解析器在解析xml的时候,会根据encoding属性所指定的编码来解析xml文件。
注意: 文件在保存时所使用的编码要和encoding属性所指定编码相同, 才可以避免乱码问题。
<?xml verison="1.0" encoding="UTF-8"? standalone="yes">
standalone用来声明当前文档是否独立, 如果xml文档不依赖其他的文档而存在, 表明当前文档是一个独立的文档, 可以指定值为yes, 如果当前文档需要依赖其他的文档而存在, 需要指定值为no。
2.2.元素
◇ 一个标签(标记)就是一个元素。
◇ 标签分为开始标签和结束标签, 在开始标签和结束标签之间的文本称之为标签体。
◇ 如果一个标签既不包含标签体, 也不包含其他的子标签, 可以把开始标签和结束标签合并成一个自闭标签。
◇ 标签要合理的嵌套, 不能出现交叉嵌套。
◇ 一个xml文件有且仅有一个根标签。
◇ 元素的命名规范:
区分大小写。 如:<P>和<p>是两个不同的标签。
不能以数字或标点符号开头。
不能以xml(XML, Xml)开头。
不能包含空格 如:<a b>
不能包含冒号 如:<a:b>
易犯错误:
标签没有结束标签或者是自闭标签没有自闭!!!
2.3.属性
一个元素上可以声明多个属性, 多个属性之间用空格隔开。
属性与属性值用等号连接, 属性的值用单引号或者双引号引起来。
属性的命名和元素遵循相同的命名规范。
2.4.注释 (了解)
格式: <!-- xml注释 -->
注释不能放在文档声明的前面
注释不能交叉嵌套
2.5.转义字符 (了解)
常用的转义字符:
< <
> >
& &
" "
' '
一.xml约束 (了解)
约束: 在xml中, 可以提供约束文档来约束xml文档的写法
DTD/Schema W3C
DTD:简单易学,上手快,但是功能有局限性,不能限制标签体的值的类型或者值的范围
Schema:复杂,不好学,但是可以实现精细的限定
二.xml解析
4.1.两种解析思想 (!!!重要)
DOM解析:
将整个XML文档加到内存中,用一个Document对象来表示整个文档。将XML文档中所有的内容(元素、属性、文本等)都解析成一个一个的对象,用对象来表示元素,用对象与对象之间的引用关系来表示元素之间的层级关系。通过在程序中操作对象来间接的操作(增删改查CURD)XML文档中的内容。
优点:
(1)可以十分方便对节点进行增删改查的操作。
(2)在内存中保存了一颗文档结构树, 只需要解析一次就可以重复使用这些数据。
缺点:
(1)将整个文档都加载到内存中用对象表示,占用内存空间,如果xml文档体积非常庞大时,将会十分耗费内存。
(2)需要等整个xml文档解析完成后,才可以对节点进行操作,相对来说耗费时间,效率低。
SAX解析:
优点:
(1)由于是逐行解析,因此不需要将整个XML文档加载进内存,占用内存小。理论上多大的XML文件都可以解析
(2)由于是逐行解析,遇到想要的内容就可以停下来处理,效率高
缺点:
(1)每次需要数据都需要重新解析。
(2)只能读数据,不能对XML文档进行增删改的操作。
4.2.DOM4J解析
1 <?xml version="1.0" encoding="utf-8" ?>
2 <书架>
3 <书>
4 <书名>数据结构</书名>
5 <作者>严蔚敏</作者>
6 <售价>29.00元</售价>
7 </书>
8 <书>
9 <书名>高等数学</书名>
10 <作者>同济大学数学系</作者>
11 <售价>55.00元</售价>
12 </书>
13 </书架>
1 package xmldome;
2
3 import java.util.Iterator;
4
5 import org.dom4j.Document;
6 import org.dom4j.DocumentException;
7 import org.dom4j.Element;
8 import org.dom4j.io.SAXReader;
9 import org.junit.Test;
10
11 public class Demo01 {
12 public static void main(String[] args) {
13
14 }
15
16 @Test
17 public void m() {
18 System.out.println("燕雀不知");
19 }
20 /**
21 * 获取第一本书名
22 * @throws DocumentException
23 */
24 @Test
25 public void find() throws DocumentException {
26 // 创建sax对象来解析xml
27 SAXReader reader = new SAXReader();
28 // 解析一个xml返回一个document
29 Document document = reader.read("a.xml");
30 // 通过document获得根标签
31 Element rootElement = document.getRootElement();
32 // 获取所有document元素的迭代器
33 Iterator<Element> it = rootElement.elementIterator();
34 // 迭代所有元素
35 while (it.hasNext()) {
36 Element e = it.next();
37 if ("书".equals(e.getName())) {
38 //“书”下的迭代器迭代到书名的时候
39 Iterator<Element> it2 = e.elementIterator("书名");
40 //迭代“书”元素
41 while (it2.hasNext()) {
42 //因为书中只有书获取名字
43 Element e2 = it2.next();
44 System.out.println("name=" + e2.getName());
45 //获取书的标签体
46 String value = e2.getText();
47 System.out.println("value=" + value);
48
49 }
50 break;
51 }
52
53 }
54
55 }
56 /**
57 * 获得所有书命和对应的作者
58 * @throws DocumentException
59 */
60 @Test
61 public void m1() throws DocumentException {
62 SAXReader reader = new SAXReader();
63 Document document = reader.read("a.xml");
64 Element rootE = document.getRootElement();
65 Iterator<Element> it = rootE.elementIterator();
66 while (it.hasNext()) {
67 Element e = it.next();
68 if ("书".equals(e.getName())) {
69 Iterator<Element> it1 = e.elementIterator("书名");
70 while (it1.hasNext()) {
71 Element e2 = it1.next();
72 System.out.println("name="+e2.getName());
73 System.out.println("value="+e2.getText());
74 }
75 Iterator<Element> it2 = e.elementIterator("作者");
76 while(it2.hasNext()){
77 Element e3 = it2.next();
78 System.out.println("name="+e3.getName());
79 System.out.println("value="+e3.getText());
80 }
81 }
82 }
83
84 }
85 }
1 package xmldemo;
2
3 import java.io.FileNotFoundException;
4 import java.io.FileOutputStream;
5 import java.io.IOException;
6 import java.io.OutputStream;
7 import java.io.UnsupportedEncodingException;
8
9 import org.dom4j.Attribute;
10 import org.dom4j.Document;
11 import org.dom4j.DocumentException;
12 import org.dom4j.Element;
13 import org.dom4j.io.OutputFormat;
14 import org.dom4j.io.SAXReader;
15 import org.dom4j.io.XMLWriter;
16 import org.junit.Test;
17
18
19
20 public class Dom4j {
21 public static void main(String[] args) {
22
23 }
24
25 // dom4j解析
26 // 一、利用dom4j操作元素节点
27 // 1.查询第一本书的书名,并输出到控制台
28 // 2.给第一本书添加一个特价节点, 并修改第一本书的售价节点的内容为19.8元
29 // 3.删除第二本书的作者节点
30 private String path = "a.xml";//定义路径
31 //获取document
32 public Document getdoc() throws DocumentException{
33 SAXReader reader = new SAXReader();
34 Document document = reader.read(path);
35 return document;
36 }
37 //从流中写入
38 public void writeToFile(Document document) throws IOException{
39 //先声明一个输出格式
40 OutputFormat format = OutputFormat.createPrettyPrint();
41 //new一个xml的输出流
42 XMLWriter writer = new XMLWriter(new FileOutputStream(path), format);
43 //输出参数document
44 writer.write(document);
45 writer.close();
46 }
47
48 @Test
49 public void find() throws DocumentException {
50 //获取document
51 Document document = this.getdoc();
52 //获取文档根元素
53 Element rootEle = document.getRootElement();
54 //获取第一本书的元素
55 Element book = rootEle.element("书");
56 //获取第一本书的书名元素
57 Element bname = book.element("书名");
58 //获取并打印书名元素的标签体
59 System.out.println(bname.getText());
60 }
61
62 @Test
63 public void add() throws DocumentException, IOException{
64 //获取document
65 Document document = this.getdoc();
66 //获取根元素
67 Element rootEle = document.getRootElement();
68 //获取根元素下的书元素
69 Element book = rootEle.element("书");
70 //在书元素下添加特价节点,并给其标签提
71 book.addElement("特价").addText("10元");
72 //通过xml输出流输出到文件
73 this.writeToFile(document);
74 }
75
76 @Test
77 public void modify() throws DocumentException, IOException{
78 //获取docment
79 Document document = this.getdoc();
80 //获取根元素
81 Element rootEle = document.getRootElement();
82 //获取书元素
83 Element book = rootEle.element("书");
84 //获取售价元素
85 Element sale = book.element("售价");
86 //重新设置售价
87 sale.setText("19.8元");
88 //写出到xml
89 this.writeToFile(document);
90 }
91
92 @Test
93 public void remove() throws DocumentException, IOException{
94 //获取docment
95 Document document = this.getdoc();
96 //获取根元素
97 Element rootEle = document.getRootElement();
98 //获取第二本书元素
99 Element book = (Element) rootEle.elements("书").get(1);
100 //获取作者元素
101 Element sale = book.element("作者");
102 //删除作者
103 book.remove(sale);
104 //写出到xml
105 this.writeToFile(document);
106 }
107
108 // 二、利用dom4j操作属性节点
109 // 1.给第一本书添加一个属性,如:出版社="清华大学出版社"
110 // 2.在控制台上打印输出第一本书的出版社属性的值, 并更新属性的值为“人民出版社”
111 // 3.删除第一本书的出版社属性
112 @Test
113 public void addAttr() throws DocumentException, IOException{
114 Document document = this.getdoc();
115 Element rootEle = document.getRootElement();
116 Element e = rootEle.element("书");
117 //给第一本书添加属性
118 e.addAttribute("出版社", "清华大学出版社");
119 this.writeToFile(document);
120
121 }
122
123 @Test
124 public void printAttri() throws DocumentException, IOException{
125 Document document = this.getdoc();
126 Element rootEle = document.getRootElement();
127 Element book = rootEle.element("书");
128 //获取第一个属性出版社
129 Attribute attribute = book.attribute(0);
130 //获取属性的值
131 String value = attribute.getValue();
132 System.out.println(value);
133 //更改属性的值
134 attribute.setValue("人民出版社");
135 //输出到xml
136 this.writeToFile(document);
137 }
138
139 @Test
140 public void removeAttr() throws DocumentException, IOException{
141 Document document = this.getdoc();
142 Element rootElement = document.getRootElement();
143 //获取书
144 Element element = rootElement.element("书");
145 //获取书的出版社属性
146 Attribute attribute = element.attribute("出版社");
147 //删除
148 element.remove(attribute);
149 //写出
150 this.writeToFile(document);
151 }
152
153 @Test
154 public void addEle() throws DocumentException, IOException{
155 Document document = this.getdoc();
156 Element rootElement = document.getRootElement();
157 //找到书元素
158 Element book2 = (Element) rootElement.elements("书").get(1);
159 //添加书元素的子元素学期与标签体
160 book2.addElement("学期").addText("大二上学期");
161 this.writeToFile(document);
162
163 }
164
165
166 }