什么是XML

XML个称为Extensible Markup Language,意思是可扩展的标记语言。

应用常见

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
<web-app>
    <servlet>
        <servlet-name>HelloServlet</servlet-name>
        <servlet-class>com.oracle.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloServlet</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>
<?xml version="1.0" encoding="UTF-8"?>

-<person>


-<person1>

<name>张三</name>

<age>18</age>

</person1>

<!--这是注释标签 -->



-<person2>

<name>张三</name>

<age>>18</age>

-<![CDATA[
            if(a>b&&a<b){
                a=b;
            }
        ]]>
</person2>

</person>

元素命名:

    区分大小写

   不能使用空格,不能使用冒号:

    不建议以XML,  xml,  Xml开头

 格式化良好的XML文档,必须只有一个根元素

 

什么是DTD

 DTD (Document Type Definition ),文档类型定义,用来约束XML文档

规定XML文档中元素的名称,子元素的名称及顺序,元素的属性等。

<?xml version="1.0" encoding="UTF-8"?>
<!--
    模拟servlet2.3规范,如果开发人员需要在xml使用当前DTD约束,必须包括DOCTYPE。
    格式如下:
    <!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
-->
<!ELEMENT web-app (servlet*,servlet-mapping* , welcome-file-list?) >
<!ELEMENT servlet (servlet-name,description?,(servlet-class|jsp-file))>
<!ELEMENT servlet-mapping (servlet-name,url-pattern+) >
<!ELEMENT servlet-name (#PCDATA)>
<!ELEMENT servlet-class (#PCDATA)>
<!ELEMENT url-pattern (#PCDATA)>
<!ELEMENT description (#PCDATA)>
<!ELEMENT jsp-file (#PCDATA)>

<!ELEMENT welcome-file-list (welcome-file+)>
<!ELEMENT welcome-file (#PCDATA)>

<!ATTLIST web-app version CDATA #IMPLIED>

 元素声明

 

定义元素语法:<!ELEMENT元素名 元素描述>

    元素名:自定义

    元素描述包括 : 符号和数据类型

          常见符号: ?  *  +  ()  |  ,

          常见类型:#PCDATA表示内容是文本,不能是子标签

符号

符号类型

 

描述

示例

 

?

问号

表示该对象可以出现,但只能出现一次

(菜鸟?)

 

*

星号

 

表示该对象允许出现任意多次,也可以是零次

(爱好*)

 

+

加号

 

表示该对象最少出现一次,可以出现多次

(成员+)

 

()

括号

 

用来给元素分组

(古龙|金庸|梁羽生),

(王朔|余杰),毛毛

 

 

|

竖条

 

表明在列出的对象中选择一个

 

(男人|女人)

 

,

逗号

表示对象必须按指定的顺序出现

(西瓜,苹果,香蕉)

 

 

实例:

<!ELEMENT  web-app(servlet*,servlet-mapping*,welcome-file-list?)>
    web-app包括3个标签,且必须顺序出现。
        servlet子标签个数任意
        servlet-mapping子标签个数任意
        welcome-file-list子标签最多只能出现一次
<!ELEMENT servlet(servlet-name,description?,(servlet-class|jsp-file))>
    servlet有3个子标签,且必须顺序出现
        servlet-name,必须有,且只能出现1次
        description,可选1次
        servlet-class和jsp-file二选一,且只能出现一次
<!ELEMENT servlet-name(#PCDATA)>
    servlet-name的标签体必须是文本
<!ELEMENT  welcome-file-list  (welcome-file+)>
      welcome-file-list至少有1个子标签welcome-file

Schema约束

什么是Schema

  Schema是新的XML文档约束:

  Schema要比DTD强大很多,是DTD替代者;

  Schema本身也是XML文档,但Schema文档的扩展名为xsd,而不是xml .

  Schema功能更强大,数据类型更完善

  Schema支持名称空间

实例:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://www.example.org/web-app_2_5" 
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.example.org/web-app_2_5 web-app_2_5.xsd"
            version="2.5">
    <servlet>
        <servlet-name></servlet-name>
        <servlet-class></servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name></servlet-name>
        <url-pattern></url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file></welcome-file>
        <welcome-file></welcome-file>
    </welcome-file-list>
</web-app>

dom4j解析

 DOM解析原理及结构模型

API使用

public class Demo01 {
    public static void main(String[] args) throws Exception {
        //1.获取解析器
        SAXReader saxReader=new SAXReader();
        //2.获得document文档对象
        Document doc=saxReader.read("src/com/oracle/demo03/web.xml");
        //3.获取根元素
        Element rootElement=doc.getRootElement();
        //获取元素名称
        //System.out.println(rootElement.getName());
        //获取元素中的指定属性的属性值
        //System.out.println(rootElement.attributeValue("version"));
        //4.获取根元素下的所有子元素
        List<Element> childElements=rootElement.elements();
        //5.遍历子元素
        for(Element element:childElements){
        //6.判断元素名称为servlet的元素
            if("servlet".equals(element.getName())){
        //7.获取servlet-name元素
                Element servletName=element.element("servlet-name");
        //8.获取servlet-class元素
                Element servletClass=element.element("servlet-class");
                System.out.println(servletName.getText());
                System.out.println(servletClass.getText());
            }
        }
    }
}

案例实现:

准备工作

package com.oracle.demo03;

public interface MyServlet {
    public void init();
    public void service();
    public void destory();
}
public class MyServletImp implements MyServlet{

    public void init() {
        System.out.println("初始化");
        
    }
    public void service() {
        System.out.println("工作");
        
    }
    public void destory() {
        System.out.println("死亡");
        
    }

}
public class Demo {
    public static void main(String[] args) throws Exception {
        //1.解析对象
        SAXReader saxReader=new SAXReader();
        //2.获取document对象
        Document doc=saxReader.read("src/com/oracle/demo03/web.xml");
        //3.获取根元素
        Element rootElement=doc.getRootElement();
        //4.获取根元素下的所有子元素
        List<Element> childElements=rootElement.elements();
        String className=null;
        for(Element element:childElements){
            if("servlet".equals(element.getName())){
                className=element.element("servlet-class").getText();    
            }
        }
        //5.创建字节码对象
        Class c=Class.forName(className);
        MyServletImp myservlet=(MyServletImp)c.newInstance();
        myservlet.init();
        myservlet.service();
        myservlet.destory();
    }public class Demo {
    public static void main(String[] args) throws Exception {
        //1.解析对象
        SAXReader saxReader=new SAXReader();
        //2.获取document对象
        Document doc=saxReader.read("src/com/oracle/demo03/web.xml");
        //3.获取根元素
        Element rootElement=doc.getRootElement();
        //4.获取根元素下的所有子元素
        List<Element> childElements=rootElement.elements();
        String className=null;
        for(Element element:childElements){
            if("servlet".equals(element.getName())){
                className=element.element("servlet-class").getText();    
            }
        }
        //5.创建字节码对象
        Class c=Class.forName(className);
        MyServletImp myservlet=(MyServletImp)c.newInstance();
        myservlet.init();
        myservlet.service();
        myservlet.destory();
    }