一、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"?>
- 文档声明必须为<?xml开头,以?>结尾。
- 文档声明必须从文档的0行0列位置开始。
- 文档声明只有3个属性:
- version:指定XML文档版本。必须属性。
- encoding:指定当前文档的编码。可选属性,默认值为utf-8。
- 元素Element:
- 元素是XML文档中最重要的组成部分。
- 普通元素的结构开始标签、元素体、结束标签组成。
- 元素体:元素体可以是元素,也可以是文本。
- 空元素:元素只有开始标签,而没有结束标签,但元素必须自己闭合。例如
<c/>
- 元素命名:
- 区分大小写
- 不能使用空格,不能使用冒号
- 不建议以XML、xml、Xml开头
- 格式化良好的XML文档,必须只有一个根元素。
- 属性:
<web-app version="4.0" id="1"></web-app>
- 属性是元素的一部分,它必须出现在元素的开始标签中。
- 属性的定义格式:属性名=“属性值”,其中属性必须使用单引号或双引号。
- 一个元素可以有0或者多个属性,但一个元素不能出现同名属性。
- 属性名不能使用空格、冒号等特殊字符,且必须以字母开头。
- 注释:
<!-- 注释 -->
- XML的注释与HTML相同,注释的内容不会被XML解析。
- 转义字符:
< | < ; | less than |
---|---|---|
> | > ; | greater than |
& | & ; | ampersand |
’ | &apos ; | apostrophe |
" | " ; | quotation mark |
- CDATA区
- CDATA区不能包括 ]]>,即CDATA区的结束边界。
<![CDATA[
可存放任意内容,特殊符号无需使用转义字符。
]]>
二、DTD约束
1.什么是DTD
- DTD(Document Type Definition),文档类型定义,用来约束XML文档。规定XML文档中元素的名称,子元素的名称及顺序,元素的属性等。
- 开发中,我们很少会去编写DTD约束文档,通常情况我们都是通过框架提供的DTD约束文档,来编写XML文档。
2.DTD语法
- 文档声明
- 内部DTD,在XML文档内部嵌入,只对当前XML有效。
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!DOCTYPE web-app[
//具体语法
]>
<web-app></web-app>
- 外部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>
- 外部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 元素名 元素描述>
- 元素名:自定义
- 元素描述包括:符号和数据类型
- 常见符号:? * + { } | ,
- 常见类型:#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 属性类型 约束
……
>
- 元素名:属性必须是给元素添加,所以必选先确定元素名
- 属性名:自定义
- 属性类型:ID、CDATA、枚举……
- ID:ID类型的属性用来标识元素的唯一性
- CDATA:文本类型
- 枚举:(e1 | e2 | ……)多选一 - 约束:
- #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.案例实现
- 步骤一:创建web.xml,将web-app_2_5.xsd文档拷贝到与web.xml同级目录下。
- 步骤二:从xsd文档中拷贝需要的"命名空间"。
- 步骤三:完成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.解析方式、解析器和解析开发包
- 解析方式
- DOM
- 将XML文档一次性加载到内存形成树形结构,解析成一个Document对象,进行解析。
- 优点:方便对树形结构进行操作,可以进行增删改的操作。
- 缺点:如果文档特别大,加载到内存,容易导致内存溢出。 - SAX(Simple Api for XML)
- 逐行扫描文档,一边扫描一边解析。以事件驱动的方式进行具体解析。
- 优点:速度更快,更有效。如果文档大,不会导致内存溢出。
- 缺点:不能进行增删改的操作。 - PULL
- Android内置的XML解析方式,类似SAX。
- DOM
- 解析器
- 根据不同解析方式提供的具体实现,为了方便开发人员,有提供易于操作的解析开发包。
- 解析开发包
- JAXP:Sun公司提供支持DOM和SAX开发包。
- JDom:与Dom4j相似但不如Dom4j完善。
- Jsoup:一种处理HTML特定解析开发包。
- 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:
- SaxReader对象
- read ( ) 加载执行XML文档。 - Document对象
- getRootElement ( ) 获得根元素 - Element对象
- elements()获得指定名称的所有子元素,可以不指定名称。
- element ()获得指定名称第一个子元素,可以不指定名称。
- getName()获得当前元素的元素名。
- attributeValue()获得指定属性名的属性值。
- elementText()获得指定名称子元素的文本值。
- getText()获得当前元素的文本内容。
- SaxReader对象
- 代码演示(获取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
查看评论