XML & Tomacat
XML介绍
eXtendsible markup language 可扩展的标记语言
作用
- 可以用来保存数据
- 可以用来做配置文件
- 数据传输载体
倒状树形结构
<?xml version="1.0" encoding="utf-8" ?>
<users>
<user1>
<name>Mephisto</name>
<age>18</age>
</user1>
<user2>
<name>Vincent</name>
<age>19</age>
</user2>
</users>
使用规范
定义XML
文件的后缀名为
.xml
命名规则
- 可以包含字母, 数字以及其他的字符
- 不能以数字或者标点符号开始
- 不能以
xml
(或者XML
,Xml
)开始 - 名称不能包含空格
文档声明
声明元素
简单声明: version:解析这个xml的时候,使用什么版本的解析器解析
<?xml version="1.0" ?>
encoding : 解析xml的文字的时候,使用什么编码来翻译
<?xml version="1.0" encoding="utf-8" ?>
standalone : no --- 该文档会依赖关联其他文档 yes-- 这是一个独立的文档
<?xml version="1.0" encoding="utf-8" standalone="no" ?>
encoding 详解
在解析这个xml的时候, 使用什么编码去解析 --- 解码
文字, 而是存储这些文字对应的二进制. 并且根据文件使用的编码来得到.
中文解决办法
- encoding GBK
- encoding 是 utf-8时候, 保存文件也是utf-8
- ANSI对应就是本地编码
元素定义(标签)
<>
括起来的是元素,成对出现
<users>
<code></code>
</users>
-
文档声明下的标签是根标签(根元素)
-
标签可以嵌套
-
空标签
<age/>
-
标签可以自定义
简单元素 & 复杂元素
- 简单元素
- 元素里包含普通文字
- 复杂元素
- 元素里面可以嵌套其他的元素
属性定义
定义在元素里面, <元素名称 属性名称="属性的值">
<?xml version="1.0" encoding="utf-8" ?>
<users>
<user1 id="001">
<name>Mephisto</name>
<age>18</age>
</user1>
<user2 id="002">
<name>Vincent</name>
<age>19</age>
</user2>
</users>
注释
<!-- 被注释块 -->
不能放置在文档的第一行, 必须在文档声明之后
转义字符
非法的XML字符必须被替换为实体引用(entity reference)
在xml中有5个预定义的实体引用
转义字符 | 字符 | 解释 |
---|---|---|
< |
< | 小于 |
> |
> | 大于 |
& |
& | 和 |
' |
. | 省略号 |
" |
'' | 引号 |
在XML中仅有<
和&
是非法的,省略号,引号和大于号是合法的
CDATA区
XML 文档中的所有文本均会被解析器解析。
只有 CDATA 区段中的文本会被解析器忽略。
格式
CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束:
<?xml version="1.0" encoding="utf-8"?>
<users>
<code>
<![CDATA[
function method(a,b){
if(a>b) then
{
return a;
}
else{
return b;
}
}
]]>
</code>
</users>
XML解析
获取元素里面的字符数据或者属性数据
XML 解析方式(常用的两种)
-
DOM(XML Document Object Model 的缩写,即 XML 文档对象模型)
把整个XML全部读到内存当中,形成树状结构, 整个文档成为document对象 属性对应为Attribute对象, 所有元素的几点对应Element对象, 文本也可以称为Text对象,以上所有对象都可以称为Node节点.
如果XML特别大,那么会造成内存溢出.
可以对文档进行增删操作
-
SAX(Simple API for XML 基于事件驱动)
读取一行,解析一行
不会造成内存溢出, 不可以进行增删,只能查询
针对以上两种解析方式的API
- jaxp sun公司, 比较繁琐
- jdom
- dom4j 使用比较广泛
dom4j
element.emlment(" ") 返回该元素下的第一个元素
element.emlments(" ") 返回该元素下的所有元素
- 创建SaxReader对象
- 指定解析的xml
- 获取根元素
- 根据根元素获取子元素或者下面的子孙元素
import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class MainTest {
public static void main(String[] args) {
try {
// 创建sax读取对象
SAXReader reader = new SAXReader();
// 指定解析的xml源
Document document = reader.read(new File("src/xml/stus.xml"));
// 得到元素
// 得到根元素
Element rootElement = document.getRootElement();
// 获取根元素下一级元素 rootElement.element();
// System.out.println(rootElement.element("stu").element("age").getText());
// 获取根元素的所有子元素
List<Element> list = rootElement.elements();
for (Element element : list) {
// 获取stu元素下面的name元素
String name = element.element("name").getText();
String age = element.element("age").getText();
String address = element.element("address").getText();
System.out.println("姓名:" + name + " 年龄:" + age + " 地址:" + address);
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}
dom4j的xpath使用
xpath
xpath是一种路径语言
选取节点
表达式 | 描述 |
---|---|
nodename | 选取此节点上的所有子节点 |
/ | 从根节点选取 |
// | 性匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
路径表达式 | 结果 |
---|---|
bookstore | 选取bookstore元素的所有子节点 |
/bookstore | 选取根元素bookstore |
bookstore/book | 选取属于bookstore的子元素的所有book元素 |
//book | 选取所有book子元素 |
bookstore//book | 选择属于bookstore元素的后代所有book元素 |
//@lang | 选取名为lang的所有属性 |
谓语(Predicates)
用来查找某个特定的节点或者包括某个指定的值的节点,被嵌在方括号中
路径表达式 | 结果 |
---|---|
/booklstore/book[1] | 选取属于bookstore子元素中的第一个book元素 |
/bookstore/book[last()] | 选取属于bookstore子元素的最后一个book元素 |
/bookstore/book[last()-1] | 选取属于bookstore子元素的倒数第二个book元素 |
/bookstore/book[position()❤️] | 选取最前面的两个属于bookstore元素的子元素的book元素 |
//title[@lang] | 选取所有拥有名为lang的属性的title元素 |
//title[@lang='eng'] | 选取所有title元素,且这些元素拥有值为eng的lang属性 |
/bookstore/book[price>35.00] | 选取bookstore元素的所有book元素,且其中的price元素的值必须大于35.00 |
/booksore/book[price>35.00]/title | 选取bookstore元素中的book元素的所有title元素,其中的price元素的值必须大于35.00 |
选取未知节点
Xpath通配符可用来选取未知的XML元素
通配符 | 描述 |
---|---|
* | 匹配任何元素节点 |
@* | 匹配任何属性节点 |
node() | 匹配任何类型的节点 |
路径表达式 | 结果 |
---|---|
/bookstore/* | 选取bookstore元素的所有子元素 |
//* | 选取文档中所有元素 |
//title[@*] | 选取所有带有属性的title元素 |
选取若干路径
通过在路径中使用
|
运算符,选取若干个路径.
路径表达式 | 结果 |
---|---|
//book/title | //book/price | 选取book元素的所有title和price |
//title | //price | 选取文档中所有title和price元素 |
/bookstore/book/title | //price | 选取属于bookstore元素中的book元素的所有title元素,以及文档中所有的price |
Xpath运算符
运算符 | 描述 | 实例 | 返回值 |
---|---|---|---|
| | 计算两个节点集 | //book|//cd | 返回所有拥有book和cd元素的节点集 |
+ | 加法 | 6+4 | 10 |
- | 减法 | 6-4 | 2 |
* | 乘法 | 6*4 | 24 |
div | 除法 | 8 div 4 | 2 |
= | 等于 | price=9.80 | 如果price是9.80则返回true,如果price不是9.80则返回false |
!= | 不等于 | price=9.80 | 如果price不是9.80则返回true,如果price是9.80则返回false |
< | 小于 | price<9.80 | 如果price小于9.80则返回true,如果不小于则返回false |
<= | 小于或等于 | price<=9.80 | |
> | 大于 | ||
>= | 大于或等于 | ||
or | 或 | price = 9.80 or price = 9.70 | |
and | 与 | price>9.00 and price <9.90 | |
mod | 计算除法的余数 | 5 mod 2 | 1 |
使用流程
-
添加jar包依赖
jaxen-XXX.jar
-
在查找指定节点的时候,根据XPath语法规则来查找
import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
public class MainTest {
public static void main(String[] args) {
try {
// 创建sax读取对象
SAXReader reader = new SAXReader();
// 指定解析的xml源
Document document = reader.read(new File("src/xml/stus.xml"));
// 得到元素
// 得到根元素
Element rootElement = document.getRootElement();
// 获取根元素下一级元素 rootElement.element();
// System.out.println(rootElement.element("stu").element("age").getText());
// 获取根元素的所有子元素
/*
List<Element> list = rootElement.elements();
for (Element element : list) {
// 获取stu元素下面的name元素
String name = element.element("name").getText();
String age = element.element("age").getText();
String address = element.element("address").getText();
System.out.println("姓名:" + name + " 年龄:" + age + " 地址:" + address);
}
*/
Element nameElement = (Element) rootElement.selectSingleNode("//name");
System.out.println(nameElement.getText());
List<Node> list = rootElement.selectNodes("//name");
for (Node node : list) {
System.out.println(node.getText());
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
XML约束
DTD
可读性差,早期出现, 语法自成一派
<?xml version="1.0" encoding="UTF-8"?>
<!-- 引入网络DTD
<!DOCTYPE stus PUBLIC "//UNKNOWN//" "unknown.dtd">
-->
<!-- 引入本地DTD
<!DOCTYPE stus SYSTEM "stus.dtd">
-->
<!-- 内嵌式 -->
<!DOCTYPE stus [
<!ELEMENT stus (stu)>
<!ELEMENT stu (name,age,address)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT address (#PCDATA)>
]>
<stus>
<stu>
<name>张三</name>
<age>18</age>
<address>深圳</address>
</stu>
</stus>
Schema
xml解析起来比较方便, 替代DTD
Scheme阅读性较差
<?xml version="1.0" encoding="utf-8" ?>
<!--xmlns : xml namespace 命名空间
targetNamespace : 目标命名空间,元素与之绑定
elementFormDefault : 元素的格式化
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.mephisto.org/teacher"
elementFormDefault="qualified"
>
<xs:element name="teachers">
<xs:complexType>
<xs:sequence maxOccurs="2">
<!-- 这是一个复杂元素 -->
<xs:element name="teacher">
<xs:complexType>
<xs:sequence>
<!--以下两个是简单元素-->
<xs:element name="name" type="string"></xs:element>
<xs:element name="age" type="int"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
一个xml可以引用多个schema约束, 但是只能引用一个DTD约束
Tomcat
目录介绍
- bin
- 包含了一些jar, bat文件
- conf
- tomcat配置 server.xml web.xml
- lib
- tomcat运行所需的jar文件
- logs
- 运行的日志文件
- temp
- 临时文件
- webapps
- 发布到tomcat服务器上的项目
- work
- jsp翻译成java文件存放地