XML

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.转义字符 (了解)
常用的转义字符:
< &lt;
> &gt;
& &amp;
" &quot;
' &apos;

一.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 }

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/vinland/p/9589531.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值