XML

WEB编程中,可以通过浏览器访问WEB服务器上的资源。

WEB服务器就是另一台计算机

浏览器的入口不同(访问路径),访问的资源也不同。

为了灵活实现的不同路径执行不同的资源,需要使用XML进行配置;

为了限定XML内容,需要使用xml约束(DTDschema);

为了获得xml的内容,需要使用dom4j进行解析。

1 XML概述

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

XML语法上和HTML比较相似,但HTML中的元素是固定的,而XML的标签是可以由用户自定义的。

使用1.0版本

XML 被设计用来传输和存储数据。

2 XML HTML 的差异

XML 不是 HTML 的替代。XML 是对 HTML 的补充。

XML HTML 为不同的目的而设计:

XML 被设计为传输和存储数据,其焦点是数据的内容。

HTML 被设计用来显示数据,其焦点是数据的外观。

HTML 旨在显示信息,而 XML 旨在传输信息。

3 XML语法

3.1文档声明

<?xml version="1.0" encoding="UTF-8"?>

1文档声明必须为<?xml开头,以?>结束

2文档声明必须从文档的0行0列位置开始(必须在第一行,注释也不能加)

3文档声明只有属性:

versioin:指定XML文档版本。必须属性,只写1.0

Encoding:指定当前文档的编码。可选属性,默认值是utf-8

3.2元素

1元素是XML文档中最重要的组成部分

2普通元素的结构由开始标签、元素体、结束标签组成。例如:<hello>大家好</hello>

3元素体:元素体可以是元素,也可以是文本,例如:<b><a>你好</a ></b>

4)必须正确地嵌套

5空元素:空元素只有开始标签,没有结束标签,但元素必须闭合,例如:<c/>

6元素命名:

区分大小写

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

不建议以XML,  xml,  Xml开头

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

3.3属性

1属性是元素的一部分,必须出现在元素的开始标签中

2属性的定义格式:属性名=属性值,属性值必须使用单引号或双引号

3一个元素可以有0-n个属性,但一个元素中不能出现同名属性

4属性名不能使用空格、冒号等特殊字符,且必须以字母开头

3.4注释

XML的注释与HTML相同,以“<!--”开始,以“-->”结束。

注释内容会被XML解析器忽略

3.5转义字符(实体引用)

XML中的转义字符与HTML一样。

因为很多符号己经被XML文档结构所使用,所以在元素体或属性值中想使用这些符号就必须使用转义字符,例如:"<"”>”、” ’ ”、” ” ”、”&”。

Tips:在 XML 中,只有字符 "<" "&" 确实是非法的。大于号是合法的,但是用实体引用来代替它是一个好习惯。

3.6 CDATA

当大量的转义字符出现在xml文档中时,会使xml文档的可读性大幅度降低。这时如果使用CDATA段就会好一些。

CDATA段中出现的“<”、“>’,、“””、“‘”、“&”,都无需使用转义字符。这可以提高xml文档的可读性。

CDATA段中不能包含“]]>”,即CDATA段的结束定界符。

例:

建一个xml文件:

  

<?xml version="1.0" encoding="UTF-8"?>
<school name="oracle" size="3">
    <persons>
        <person>
            <name>张三</name>
            <age>18</age>
        </person>
        <person>
            <name>李四&lt;</name>            
            <![CDATA[
                if(a>"3"){
                    a=2;
                }
            ]]>            
            <age>19</age>
        </person>
    </persons>
</school>

 

预览:

右键--Open With--Other--

 

4约束

常用DTD约束和Schema约束

5 DTD

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

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

开发中,很少自己编写DTD约束文档,通常都是通过框架提供的DTD约束文档,编写对应的XML文档。

常见框架使用DTD约束有:struts2hibernate等。

5.1DTD语法

5.1.1文档声明(第2和第3种常用)

1)内部DTD,在XML文档内部嵌入DTD,只对当前XML有效。

<?xml version="1.0" encoding="UTF-8"? standalone="yes" ?>

<!DOCTYPE web-app [

...//具体语法

]>

<web-app>

</web-app>

2)外部DTD——本地DTDDTD文档在本地系统上,公司内部自己项目使用。

3)外部DTD——公共DTDDTD文档在网络上,一般都有框架提供。

 

5.1.2元素声明

符号

符号类型

描述

示例

?

问号

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

(菜鸟?

*

星号

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

(爱好*)

+

加号

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

(成员+)

()

括号

用来给元素分组

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

(王朔|余杰),毛毛

|

竖条

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

(男人|女人)

,

逗号

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

(西瓜,苹果,香蕉)

 实例:

<!ELEMENT  web-app(servlet*servlet-mapping*,welcome-file-list?)>

    web-app包括3个标签,且必须顺序出现。

        servlet子标签个数任意

        servlet-mapping子标签个数任意

        welcome-file-list子标签最多只能出现一次

<!ELEMENT servlet(servlet-namedescription?(servlet-class|jsp-file))>

    servlet3个子标签,且必须顺序出现

        servlet-name,必须有,且只能出现1

        description,可选1

        servlet-classjsp-file二选一,且只能出现一次

<!ELEMENT servlet-name(#PCDATA)>

    servlet-name的标签体必须是文本

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

      welcome-file-list至少有1个子标签welcome-file

 5.1.3属性声明 

语法了解一下即可。

5.2实际使用

1

 

把这个dtd文件复制项目中的包中

在同级目录下建一个web.xml(注意,一个项目只能有一个web.xml文件)

 

2)复制这一句到web.xml中:

 

3)然后Alt+/就有提示了

 

实例代码:

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

简单解释(以后会再学): 

浏览器访问地址:http://localhost:8080/Day22/hello

后面的/hello就是servlet-mapping中的url-pattern,所以这里要加个/,根据这个找到

servlet-name,再找到servlet中的servlet-name,再找到servlet-class,里面的包名+类名,就找到要执行的类了,这就是程序的入口。

welcome-file-list是欢迎页面,当只访问项目http://localhost:8080/Day22时,先显示第一个welcome-file里的页面,如果没有,再接着找第二个页面。

6 Schema约束(常用)

Schema是新的XML文档约束

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

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

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

Schema支持名称空间

6.1实际使用

dtd大体一样,也是先把.xsd加到项目中,再建web.xml文件

 

复制声明,再Alt+/,一一点出来即可

 

 

实例代码:

<?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>AddServlet</servlet-name>
        <servlet-class>demo01.AddServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>AddServlet</servlet-name>
        <url-pattern>/AddServlet</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>

7 dom4j解析

当将数据存储在XML后,我们就希望通过程序获得XML的内容。

IO流可以,但太繁琐

7.1解析方式

1DOM

解析器把整个XML文档装载到内存,并解析成一个Document对象。

优点:元素与元素之间保留结构关系,故可以进行增删改查操作。

缺点:XML文档过大,可能出现内存溢出现象。

2SAX

是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都将触发对应的事件。

优点:处理速度快,可以处理大文件

缺点:只能读,逐行后将释放资源。

3PULL

Android内置的XML解析方式,类似SAX

7.2常见的解析开发包

JAXPsun公司提供支持DOMSAX开发包

JDomdom4j兄弟

Jsoup:一种处理HTML特定解析开发包

dom4j:比较常用的解析开发包,hibernate底层采用

7.3DOM解析原理及结构模型

XML DOMHTML DOM类似,XML DOM将整个XML文档加载到内存,生成一个DOM树,

并获得一个Document对象,通过Document对象就可以对DOM进行操作。

DOM中的核心概念就是节点,在XML文档中的元素、属性、文本等,在DOM中都是节点。

 

7.4 API使用

常用方法:

 

1)导入jar

 

2)步骤:

1.获取解析器

2.获得document文档对象

3.获取根元素

4.获取根元素下的子元素

5.遍历子元素

6.判断元素名称为servlet的元素

7.获取servlet-name元素

8.获取servlet-class元素

1

<?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>AddServlet</servlet-name>
        <servlet-class>demo01.AddServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>AddServlet</servlet-name>
        <url-pattern>/AddServlet</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

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

例2通过反射模拟获取对象并调用方法

<?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>AddServlet</servlet-name>
        <servlet-class>demo03.AddServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>AddServlet</servlet-name>
        <url-pattern>/AddServlet</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>
</web-app>
public class AddServlet {
    public void init(){
        System.out.println("servlet初始化");
    }
    public void service(){
        System.out.println("servlet业务");
    }
    public void destroy(){
        System.out.println("servlet销毁");
    }
}
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Test {
    public static void main(String[] args) throws DocumentException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        //1.创建解析器对象
        SAXReader saxReader=new SAXReader();
        //2.使用解析器加载web.xml文件得到document对象
        Document doc=saxReader.read("src/demo03/web.xml");
        //3.获取根元素节点
        Element root=doc.getRootElement();
        //4.根据元素名称获取子元素节点
        Element servlet=root.element("servlet");
        //5.根据元素名称获取servlet-class的文本节点
        Element servletClass=servlet.element("servlet-class");
        String classTest=servletClass.getText();        
        //6.通过类全名获取字节码文件
        Class c=Class.forName(classTest);
        //7.创建实例对象  
        Object obj=c.newInstance();
        AddServlet add=(AddServlet)obj;
        //8.调用实例对象里面的方法        
        add.init();
        add.service();
        add.destroy();
    }
}

 

原文地址:https://www.cnblogs.com/hzhjxx/p/10225347.html