小言_互联网的博客

JavaWeb基础之XML文档

438人阅读  评论(0)

一、XML介绍

1.什么是XML

  • XML全称为Extensible Markup Language,意思是可拓展的标记语言。
  • XML语法上和HTML比较相似,但HMTL中的元素是固定的,而XML的标签是可以由用户自定义的。
  • XML的设计宗旨是传输数据,而不是现实数据。
  • XML被设计为具有自我描述性。
  • XML是W3C的推荐标准。

2.XML和HTML之间的差异

  • XML是对HTML的补充。
  • XML 被设计用来传输和存储数据,其焦点是数据的内容。
  • HTML 被设计用来显示数据,其焦点是数据的外观。

3.XML的用途

  • 把数据从HTML分离
  • 简化数据共享
  • 简化数据传输
  • 简化平台变更
  • 使数据更有用

4.XML的常见应用

  • 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
<servlet-mapping>
    <servlet-name>loginServlet</servlet-name>
    <url-pattern>/login</url-pattern>
</servlet-mapping>
<servlet>
    <servlet-name>loginServlet</servlet-name>
    <servlet-class>cn.mrzhang.lesson.UserServlet</servlet-class>
</servlet>
</web-app>
  • 存放数据
<?xml version="1.0" encoding="UTF-8"?>
<persons>
	<person id="p001">
		<name>小明</name>
	</person>
	<person id="p002">
		<name>小红</name>
	</person>
</persons>

5.XML语法

  • XML文档声明:
<?xml version="1.0" encoding="UTF-8"?>
  1. 文档声明必须为<?xml开头,以?>结尾。
  2. 文档声明必须从文档的0行0列位置开始。
  3. 文档声明只有3个属性:
    • version:指定XML文档版本。必须属性。
    • encoding:指定当前文档的编码。可选属性,默认值为utf-8。
  • 元素Element:
    • 元素是XML文档中最重要的组成部分。
    • 普通元素的结构开始标签、元素体、结束标签组成。
    • 元素体:元素体可以是元素,也可以是文本。
    • 空元素:元素只有开始标签,而没有结束标签,但元素必须自己闭合。例如<c/>
    • 元素命名:
      • 区分大小写
      • 不能使用空格,不能使用冒号
      • 不建议以XML、xml、Xml开头
    • 格式化良好的XML文档,必须只有一个根元素。
  • 属性:
<web-app version="4.0" id="1"></web-app>
  1. 属性是元素的一部分,它必须出现在元素的开始标签中。
  2. 属性的定义格式:属性名=“属性值”,其中属性必须使用单引号或双引号。
  3. 一个元素可以有0或者多个属性,但一个元素不能出现同名属性。
  4. 属性名不能使用空格、冒号等特殊字符,且必须以字母开头。
  • 注释:
<!--  注释  -->
  1. XML的注释与HTML相同,注释的内容不会被XML解析。
  • 转义字符:
< &lt ; less than
> &gt ; greater than
& &amp ; ampersand
&apos ; apostrophe
" &quot ; quotation mark
  • CDATA区
    • CDATA区不能包括 ]]>,即CDATA区的结束边界。
<![CDATA[
	可存放任意内容,特殊符号无需使用转义字符。
]]>

二、DTD约束

1.什么是DTD

  • DTD(Document Type Definition),文档类型定义,用来约束XML文档。规定XML文档中元素的名称,子元素的名称及顺序,元素的属性等。
  • 开发中,我们很少会去编写DTD约束文档,通常情况我们都是通过框架提供的DTD约束文档,来编写XML文档。

2.DTD语法

  • 文档声明
  1. 内部DTD,在XML文档内部嵌入,只对当前XML有效。
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!DOCTYPE web-app[
	//具体语法
]>
<web-app></web-app>
  1. 外部DTD----本地DTD,DTD文档在本地。
<?xml version="1.0" encoding="utf-8" standalone="no" ?>
<!DOCTYPE web-app SYSTEM "路径/web-app_2_3.dtd">
<web-app></web-app>
  1. 外部DTD----公共DTD,DTD文档在网络上,一般框架都有提供。
<?xml version="1.0" encoding="utf-8" standalone="no" ?>
<?xml version="1.0" encoding="utf-8" standalone="no" ?>
<!DOCTYPE web-app PUBLIC "网络地址/web-app_2_3.dtd">
<web-app></web-app>
  • 文档声明
定义元素语法:<!ELEMENT 元素名 元素描述>
  1. 元素名:自定义
  2. 元素描述包括:符号和数据类型
    - 常见符号:? * + { } | ,
    - 常见类型:#PCDATA 表示内容是文本,不能是子标签
符号 符号类型 描述 示例
? 问号 表示该对象可以出现,但只能出现1次或者0次 (first?)
* 星号 表示该对象允许出现任意次,也可以是0次 (second*)
+ 加号 表示该对象至少出现1次,可以出现多次 (third+)
() 括号 用来给元素分组 (first|second|third),(fourth|fifth),sixth
| 竖线 表示在列出的对象中选择1个 (first|second|third)
, 逗号 表示对象必须按照指定顺序出现 (first,second,third)
<!ELEMENT web-app(servlet*,servlet-mapping*,welcome-file-list?)>
	web-app包括三个标签前,且必须按顺序出现。
		servlet子标签个数任意
		servlet-mapping子标签个数任意
		welcome-file-list子标签最多只能出现1次
<!ELEMENT servlet(servlet-name,description?,(servlet-class|jsp-file))>
	servlet有3个子标签,且必须按顺序出现
		servlet-name必须有,且只能出现1次
		description可以出现0次或1次
		servlet-class和jsp-file二选一,且只能出现1次
<!ELEMENT servlet-name(#PCDATA)>
	servlet-name的标签体必须是文本
<!ELEMENT welcome-file-list (welcome-file+)>
	welcome-file-list 至少有一个子标签welcome-file
  • 属性声明
属性的语法:(attribute)
	<!ATTLIST 元素名
		属性名1 属性类型 约束
		属性名2 属性类型 约束
		……
	>
  1. 元素名:属性必须是给元素添加,所以必选先确定元素名
  2. 属性名:自定义
  3. 属性类型:ID、CDATA、枚举……
    - ID:ID类型的属性用来标识元素的唯一性
    - CDATA:文本类型
    - 枚举:(e1 | e2 | ……)多选一
  4. 约束:
    - #REQUIRED:required说明属性是必须的
    - #IMPLIED:implied说明属性是可选的
<!ATTLIST web-app version CDATA #IMPLIED>
	给web-app元素添加version属性,属性值必须是文本,且是可选的。
	<web-app version="4.0"><web-app>都符合约束

3.案例实现

  • 步骤1:创建web.xml文档,将"web-app_2_3.dtd" 拷贝到与web.xml相同目录下。
  • 步骤2:从DTD文档开始处,将需要的文档声明拷贝到web.xml中。
  • 步骤3:完成web.xml文档的编写。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
<web-app version="4.0">
    <servlet>
        <servlet-name>RegisterServlet</servlet-name>
        <servlet-class>cn.mrzhang.demo1.RegisterServlet</servlet-class>
    </servlet>
    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>cn.mrzhang.demo1.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>RegisterServlet</servlet-name>
        <url-pattern>/register</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

三、Schema约束

1.什么是Schema

  • Schema是新的XML文档约束,它比DTD强大很多,是DTD的替代者。而它本身也是XML文档,但Schema文档的扩展名为xsd。它的功能更加强大,数据类型更加完善,并且支持名称空间。
  • 开发中,我们很少会去编写Schema约束文档,通常情况我们都是通过框架提供的xsd约束文档,来编写XML文档。

2.Schema介绍

  • 命名空间
    • 如果一个XML文档中使用了多个Schema文件,而这些Schema文件中定义了相同的元素时就会出现名字冲突。
    • 类似于Java中的同时导入 java.util.date 与 java.sql.date,使用Date类时,就不明确使用的是哪个包的date了。
    • 命名空间是用来处理元素和属性的名称冲突问题,与Java中的包是同一用途。
  • 约束文档和XML关系
    • W3C提出Schema约束规范时,提供了“官方约束文档”。
    • 我们通过官方文档,必须“自定义Schema约束文档”。
    • 开发中“自定义文档”由框架编写者提供,我们通过“自定义文档”,编写自己的XML文档。
    • 官方文档→自定义Schema文档→XML文档

3.案例实现

  1. 步骤一:创建web.xml,将web-app_2_5.xsd文档拷贝到与web.xml同级目录下。
  2. 步骤二:从xsd文档中拷贝需要的"命名空间"。
  3. 步骤三:完成web.xml文档编写。
<?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-list>
</web-app>

四、dom4j解析

1.XML解析概述

  • 当数据存储在XML后,要通过程序获得XML的内容。
  • Java基础中IO是可以完成的,但是非常繁琐,且可能会遇到不同问题(只读,读写)。
  • 人们为不同的问题提供不同的解析方式,并提交对应的解析器,方便我们操作XML。

2.解析方式、解析器和解析开发包

  • 解析方式
    1. DOM
      - 将XML文档一次性加载到内存形成树形结构,解析成一个Document对象,进行解析。
      - 优点:方便对树形结构进行操作,可以进行增删改的操作。
      - 缺点:如果文档特别大,加载到内存,容易导致内存溢出。
    2. SAX(Simple Api for XML)
      - 逐行扫描文档,一边扫描一边解析。以事件驱动的方式进行具体解析。
      - 优点:速度更快,更有效。如果文档大,不会导致内存溢出。
      - 缺点:不能进行增删改的操作。
    3. PULL
      - Android内置的XML解析方式,类似SAX。
  • 解析器
    • 根据不同解析方式提供的具体实现,为了方便开发人员,有提供易于操作的解析开发包。
  • 解析开发包
    1. JAXP:Sun公司提供支持DOM和SAX开发包。
    2. JDom:与Dom4j相似但不如Dom4j完善。
    3. Jsoup:一种处理HTML特定解析开发包。
    4. dom4j:比较常用的解析开发包,hibernate底层采用。

3.解析原理和解析模型

  • XML DOM与HTML DOM类似,XML DOM将整个XML文档加载到内存,生成一个DOM树,并获得一个Document对象,通过Document对象就可以对DOM进行操作。
  • DOM的核心概念就是节点,在XML文档中的元素、属性、文本等,在DOM中都是节点。

4.API的使用(重点)

  • 如果使用dom4j,必须导入jar包。
  • 下载地址:dom4j-1.6.1.jar
  • dom4j必须使用核心类SaxReader加载XML文档从而获得Document对象,通过Document对象获得文档的根元素,然后就可以操作了。
  • 常用API:
    1. SaxReader对象
      - read ( ) 加载执行XML文档。
    2. Document对象
      - getRootElement ( ) 获得根元素
    3. Element对象
      - elements()获得指定名称的所有子元素,可以不指定名称。
      - element ()获得指定名称第一个子元素,可以不指定名称。
      - getName()获得当前元素的元素名。
      - attributeValue()获得指定属性名的属性值。
      - elementText()获得指定名称子元素的文本值。
      - getText()获得当前元素的文本内容。
  • 代码演示(获取servlet-name中的内容)
package cn.mrzhang.xml;
/**
 * 获取servlet-name中的文本
 * 	步骤:
 * 		1.获取解析器
 * 		2.加载XML文档,获得Document对象
 * 		3.获得根元素
 * 		4.获取根元素下所有子元素
 * 		5.遍历所有子元素
 * 		6.处理servlet标签,获取其子标签servlet-name中的内容
 */

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.util.List;

public class dom4jDemo {
    public static void main(String[] args) throws DocumentException {

        //1.获取解析器
        SAXReader saxReader = new SAXReader();

        //2.加载XML文档,获得Document对象
        Document document = saxReader.read("src/cn/mrzhang/xml/dtd/web.xml");

        //3.获得根元素
        Element rootElement = document.getRootElement();
        //获取根元素的名称
        System.out.println(rootElement.getName());
        //获取根元素中的version属性值
        String version = rootElement.attributeValue("version");

        //4.获取根元素下所有子元素
        List<Element> allChildElements = rootElement.elements();

        //5.遍历所有子元素
        for (Element childElement :
                allChildElements) {
            //打印元素名
            System.out.println(childElement.getName());

            //6.处理servlet,获取其子标签内容
            if ("servlet".equals(childElement.getName())){
            	//获取servlet-name元素
                Element servletNameElement = childElement.element("servlet-name");
                //获取元素文本
                String servletName = servletNameElement.getText();
                System.out.println(servletName);
            }
        }
    }
}

转载:https://blog.csdn.net/weixin_44093607/article/details/104504334
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场