zoukankan      html  css  js  c++  java
  • 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文件存放地
  • 相关阅读:
    JQuery扩展方法
    RabbitMQ消息机制广播分发
    RabbitMQ消息机制单人分发
    对函数的参数求和
    ajax jsonp
    绑定函数bind()
    this 指向
    DOM兼容
    命名空间 namespace
    开始看编写高质量的代码
  • 原文地址:https://www.cnblogs.com/mephisto03/p/9581273.html
Copyright © 2011-2022 走看看