标签:dal 自定义 文本 客户端 服务 let file 空间 nts
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 }
标签:dal 自定义 文本 客户端 服务 let file 空间 nts
原文地址:https://www.cnblogs.com/vinland/p/9589531.html