1-XML介绍
extendssible markup language 可扩展的标记语言
XML的作用:
1、可以用来保存数据
2、可以用来做配置文件
3、数据传输载体
XML的倒转树形结构和html类似
具体的内容和功能都可以查看api来学习,很详细
2-XML文档声明
- 简单声明,version:解析这个xml的时候,使用什么版本的解析
如:<?xml version="1.0">
- encoding:解析xml中的文字时,什么编码存,什么编码解析
如:<?xml version="1.0" encoding="gbk">
- standalone:no - 使该文档关联其他的文档
如:<?xml version="1.0" encoding="gbk" standalone="no"?>
3-XML 元素定义、属性定义
4-XML 注释、CDATA区
如果不加注释,只能放在标签中才能正常显示,否则错误。此时可以加注释解决
一般在数据传输的时候出现,平时比较少见到
有2个非法字符(< &)必须用转义字符来代替
如果某段字符串里有过多的字符,并且里面包含了过多的标签或者关键字的这种文字,不想让xml的解析器去解析,那么可以使用CDATA来包装,不过这个CDATA一般比较少看到
用法:<![CDATA[内容]]>
5-XML 解析方式(DOM&SAX)
其实就是获取元素里面的字符数据或者属性数据 两种方法:DOM&SAX。DOM解析会把所有的文档存到内存中形成树状结构 自上而下,解析方式有很多种,但是常用的就是这两种:
同样的,解析手段:jaxp,jdom,dom4j(最常用)
6-XML dom4J入门
1、创建SAXReader对象
2、指定解析的xml
3、获取根元素
4、根据根元素获取子元素或者下面的子孙元素
element.element("stu"); //返回根元素下的第一个stu元素
element.elements("stu");//返回根元素下的所有stu元素
具体代码:
SAXReader sax = null;
Document dom = null;
try {
String filePath = "src/xml/demo.xml";
sax = new SAXReader();
dom = sax.read(filePath);
//返回xml文件的相对路径
//System.out.println(dom.getName());
//获得根元素对象的地址再获取根元素名
//System.out.println(dom.getRootElement().getName());
//获得Element集合(所有的stu元素),并获取元素下的数据
List<Element> element = dom.getRootElement().elements();
for (Element element2 : element) {
System.out.print(element2.element("name").getText()+"\t");
System.out.print(element2.element("age").getText()+"\t");
System.out.print(element2.element("address").getText());
System.out.println();
}
} catch (Exception e) {
e.printStackTrace();
}
7-XML Xpath入门
遇到新知识,新对象的时候:
1.看文档 2.记关键字 3.有对象先"."一下 4.看返回值 5.平时的积累
dom4j里面支持xpath的写法,xpath其实是xml的路径语言,支持我们在解析xml的时候,能够快速的定位判断具体的某一个元素。
- 添加jar包依赖 jaxen-1.1-beta-6.jar
- 在查找指定节点的时候,根据xpath语法规则来查找
- 后续的代码与以前的解析代码一样
具体代码:
SAXReader sax = null;
Document dom = null;
try {
String filePath = "src/xml/demo.xml";
sax = new SAXReader();
dom = sax.read(filePath);
Element re = dom.getRootElement();
//要想使用Xpath,还得添加支持的jar,获取的是第一个,只返回一个
Element nameElement = (Element)re.selectSingleNode("//name");
System.out.println(nameElement.getText());
System.out.println("--------------------");
List<Element> list = re.selectNodes("//name");
for (Element element : list) {
System.out.println(element.getText());
}
} catch (Exception e) {
e.printStackTrace();
}
8-XML XML约束
在开发过程中有的属性和数据只能唯一,或者要受限制,所以要用约束
- DTD:一种约束的方式,但是xml解析器不能解析,并且可读性较差,语法自成一派
- Schema:其实就是xml,使用xml的语法规则,xml解析器解析起来比较方便,但是文本内容多,所以也没有真正意义上替代DTD
9-XML DTD
-
引入网络上的DTD
文档类型 根标签名字 网络上的dtd dtd的名称 dtd的路径
< !DOCTYPE stus PUBLIC “//UNKNOWN/”> “unknown.dtd”> -
引入本地的DTD
引入本地的DTD:根标签名字 引入本地的DTD dtd的位置
< !DOCTYPE stus SYSTEM “stus.dtd”>
dtd文件代码如下:
< !ELEMENT stus (stu)>
< !ELEMENT stu (name,age,address)>
< !ELEMENT name (#PCDATA)>
< !ELEMENT age (#PCDATA)>
< !ELEMENT address (#PCDATA)>
引入之后,xml文件中stu只能有一个,否则会错误 -
直接在XML里面嵌入DTD的约束规则
xml文档里面直接嵌入DTD的约束法则
< !DOCTYPE stus[
< !ELEMENT stus (stu)+> stus下面有一个元素stu,但只有一个
< !ELEMENT stu (name,age)> stu下面有两个元素name,age
< !ELEMENT name (#PCDATA)>
< !ELEMENT age (#PCDATA)>
< !ATTLIST stu id CDATA #IMPLIED> stu有一个属性,文本类型,该属性可有可无]>
元素的个数:+ 一个或多个 * 零个或多个 ? 零个或一个
属性的类型:CDATA:属性是普通文字 ID:属性的值必须唯一
10-XML Schema
Schema的书写,先写元素,再逐渐写层级
teacher.xsd:
<!-- xmlns:xml namespace:名称空间
targetNamespace:下面定义的元素都与这个名称空间绑定
elementFormDefault:元素的格式化情况 -->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/teacher"
xmlns:tns="http://www.example.org/teacher"
elementFormDefault="qualified">
<!-- 为复杂元素 -->
<element name="teachers">
<complexType>
<sequence>
<!-- 为复杂元素:默认只有一个 -->
<element name="teacher">
<complexType>
<sequence maxOccurs="unbounded">
<!-- 为简单元素 -->
<element name="name"></element>
<element name="age"></element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
teacher.xml:
<!-- xmlns:xsi:这里必须是这样的写法,也就是这个值已经固定了
xmlns:这里是名称空间,也固定了,写的是chema里面的顶部目标名称空间
xsi:schemaLocation:有两段:前半段是名称空间,也是目标空间的值,后面的约束文档的路径 -->
<teachers
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.example.org/teacher"
xsi:schemaLocation="http://www.example.org/teacher teacher.xsd">
<teacher>
<name>张三</name>
<age>28</age>
</teacher>
</teachers>
命名空间的作用:一个xml如果想绑定它的约束规则,假设使用DTD,那么这个xml只能绑定一个DTD,不能绑定多个DTD,但是可以绑定多个Schema。
命名空间的作用就是可以绑定元素使用的约束规则,默认情况下如果使用一套规则,那么可以这么写:
<name>张三</name>
<aa:name></aa:name>
<bb:name></bb:name>
11-程序架构(BS&CS)
C/S(client/server)
例如:QQ 微信 LOL…
优点:有一部分代码写在客户端,用户体验较好
缺点:服务器更新,客户端也随着更新,占用资源大
B/S(browser/server)
例如:网页游戏 webQQ qq邮箱…
优点:客户端只要有浏览器就可以了,占用资源小,不用更新
缺点:用户体验不佳
12-Web服务器
服务器就是一台电脑,配置比一般的要好
客户端在浏览器的地址栏上输入地址,web服务器软件,接受请求,然后响应
过程:1:安装Tomcat 2:发布项目到Tomcat 3:Elipse配置
13-dom4J总结
使用dom4j时,不同的层级意义:
Document doc = saxR.read("src/xml/teacher.xml");
System.out.println(doc.getName()); //此时还未进入xml,所以输出相对路径
Element element = doc.getRootElement();
//阶段一:
System.out.println(element.getName()); //进入xml根元素,输出根元素名
System.out.println(element.getText()); //进入xml根元素,此时两种方法一样
//阶段二:
System.out.println(element.element("teacher").getName()); //进入teacher元素,输出teacher
System.out.println(element.element("teacher").getText()); //进入teacher元素,但无法取出子元素,所以输出换行符
//阶段三:
System.out.println(element.element("teacher").element("name").getText());
HPF-自我总结
XML&Tomcat其实是在很早之前就学了,但是笔记一直没有发上来。这也是之前的笔记,所以发上来做个分享,同时以后自己有什么地方忘了也可以参考这里的笔记。主要是做一个记录。
因为自己的懒惰,所以已经很长很长时间没有继续学习JavaWeb了,最近比较迷茫,想来想去,还是拾起JavaWeb继续学习,我会不断学习并且写下学习笔记的博客的。
——— 不积跬步,无以至千里;不积小流,无以成江海。