XML&Tomcat

XML & Tomacat

XML介绍

eXtendsible markup language 可扩展的标记语言

作用

  1. 可以用来保存数据
  2. 可以用来做配置文件
  3. 数据传输载体

倒状树形结构

<?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>
graph TD A[users] A --> B[user1] A --> C[user2] B --> E1[name] B --> E2[age] C --> F1[name] C --> F2[age]

使用规范

定义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的时候, 使用什么编码去解析 --- 解码

文字, 而是存储这些文字对应的二进制. 并且根据文件使用的编码来得到.

中文解决办法

  1. encoding GBK
  2. encoding 是 utf-8时候, 保存文件也是utf-8
  3. 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个预定义的实体引用
转义字符 字符 解释
&lt; < 小于
&gt; > 大于
&amp; &
&apos; . 省略号
&quot; '' 引号

在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(" ") 返回该元素下的所有元素

  1. 创建SaxReader对象
  2. 指定解析的xml
  3. 获取根元素
  4. 根据根元素获取子元素或者下面的子孙元素
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
使用流程
  1. 添加jar包依赖

    jaxen-XXX.jar

  2. 在查找指定节点的时候,根据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文件存放地
posted @ 2018-09-03 21:52  无聊的子木君  阅读(270)  评论(0编辑  收藏  举报