@TOC
XML简介
XML简介:
- xml 是可扩展的标记性语言。
- xml 的主要作用有: ①用来保存数据,而且这些数据具有自我描述性。 ②它还可以做为项目或者模块的配置文件。 ③还可以做为网络传输数据的格式(现在 JSON 为主)。
XML文档声明简介:
<?xml version="1.0" encoding="UTF-8"?>
- 文档声明必须为结束;
- 文档声明必须从文档的0行0列位置开始;
- 文档声明只有三个属性:
①versioin:指定XML文档版本。必须属性,因为我们不会选择1.1,只会选择1.0;
②encoding:指定当前文档的编码。可选属性,默认值是utf-8;
③standalone:指定文档独立性。可选属性,默认值为yes,表示当前文档是独立文档。
<1>
如果为no表示当前文档不是独立的文档,会依赖外部文件。
XML语法:
- xml的元素(标签),属性和注释和html的一样。
- xml的语法规则:
①所有 XML 元素都须有关闭标签(也就是闭合)
②XML 标签对大小写敏感
③XML 必须正确地嵌套
④XML 文档必须有根元素:根元素就是顶级元素, 没有父标签的元素,叫顶级元素。
<1>
根元素是没有父标签的顶级元素,而且是唯一一个才行⑤XML 的属性值须加引号 ⑥XML 中的特殊字符: >;表示大于号,<;表示小于号⑦文本区域(CDATA 区):CDATA 语法可以告诉 xml 解析器,我 CDATA 里的文本内容,只是纯文本,不需要 xml 语法解析。<1>CDATA 格式: <![CDATA[ 这里可以把你输入的字符原样显示,不会解析 xml ]]>
XML解析技术
XML解析技术介绍:
- 不管是 html 文件还是 xml 文件它们都是标记型文档,都可以使用 w3c 组织制定的 dom 技术来解析。
- 早期 JDK 为我们提供了两种 xml 解析技术
DOM和Sax(已经过时,但我们需要知道这两种技术) - dom 解析技术是 W3C 组织制定的,而所有的编程语言都对这个解析技术使用了自己语言的特点进行实现。 Java 对 dom技术解析标记也做了实现。
sun 公司在 JDK5 版本对 dom 解析技术进行升级:SAX( Simple API for XML ) SAX 解析,它跟 W3C制定的解析不太一样。它是以类似事件机制通过回调告诉用户当前正在解析的内容。 它是一行一行的读取 xml 文件进行解析的。不会创建大量的dom 对象。所以它在解析 xml 的时候,在内存的使用上和性能上。都优于 Dom 解析。
第三方的解析:
jdom 在 dom 基础上进行了封装 。dom4j 又对 jdom 进行了封装。- pull 主要用在 Android 手机开发,是在跟 sax 非常类似都是事件机制解析 xml 文件。
dom4j解析技术:
- dom4j 英文缩写 :document for java
- 由于 dom4j 它不是 sun 公司的技术,而属于第三方公司的技术,我们需要使用 dom4j 就需要到 dom4j 官网下载 dom4j的 jar 包。
- 步骤:
①创建 SAXReader 对象,通过read()方法来读取 xml 文件,获取 Document 对象
②通过 Document 对象的getRootElement()方法
拿到XML 的根元素对象③通过根元素.elelemts(标签名); 可以返回一个集合④遍历该集合: - 方法: ①通过集合元素.attribute(属性名)得到属性对象。 ②通过集合元素.element(元素名)得到子元素对象。 ③通过子元素对象.getText()得到子元素起始标签和结束标签之间的文本内容。
- 注意:
①SAXReader可以通过多种方式读取xml数据,并返回Document格式的对象。
②
通过查看源码可以看出read()方法接收File,InputStream和URL等格式的参数来读取相应的xml数据。
XML的约束
XML的约束介绍:
- 作用:
规定xml中可以出现哪些元素及哪些属性,以及他们出现的顺序。 - 约束的分类:
①
DTD约束:struts hiebernate等等 ②SCHEMA约束:tomcat spring等等 - 约束详解:既然是约束就和xml有联系,所以约束要和xml关联,xml的相关限制才才生效。和xml的关联 (一般都会提供好,复制过来即可,有时候连复制都不需要)
xml约束关联:
内部关联
格式: <!DOCTYPE 根元素名 [dtd语法]>
外部关联-系统关联
格式: <!DOCTYPE 根元素名 SYSTEM "约束文件的位置">
例如: <!DOCTYPE web-app SYSTEM "web-app_2_3.dtd">
外部关联-公共关联
格式:<!DOCTYPE 根元素名 PUBLIC "约束文件的名称" "约束文件的位置">
dtd的语法(了解):
- 无论是单独的dtd文件还是写在xml中都需要按照语法要求写.
- 注意:一个xml文档中只能添加一个DTD约束
标签(元素)语法:
<!Element 元素名称 数据类型|包含内容>
数据类型:#PCDATA:普通文本 使用的时候一般用()引起来
功能:能出现那些标签,以及出现顺序
包含内容:该元素下可以出现那些元素 用()引起来
符号:
* 出现任意次
? 出现1次或者0次
+ 出现至少1次
| 或者
() 分组
, 顺序(元素出现先后顺序,按照都好标记顺序出现)
栗子如下:(上图约束图中的代码)
<!ELEMENT web-app (servlet*,servlet-mapping* , welcome-file-list?) >
<!ELEMENT servlet-name (#PCDATA)>
ps:元素名就是xml中能够出现的元素标签名
属相的约束语法:
属性:
格式:
<!ATTLIST 元素名 属性名 属性类型 属性是否必须出现>
属性类型:
ID:唯一
CDATA:普通文本
属性是否必须出现
REQUIRED:必须出现
IMPLIED:可以不出现
例如:
<!ATTLIST web-app version CDATA #IMPLIED>
schema约束:
- 一个xml文档中可以添加多个schema约束
xml和schema的关联.
格式:
<根标签 xmlns="..." ...>
<根标签 xmlns:别名="..." ...>
名称空间:
关联约束文件
规定元素是来源于那个约束文件的
例如:
一个约束文件中规定 table(表格) 表格有属性 row和col
还有一个约束文件规定 table(桌子) 桌子有属性 width和height
在同一个xml中万一我把两个约束文件都导入了,
在xml中我写一个table,这个table有什么属性????
我们为了避免这种情况的发生,可以给其中的一个约束起个别名
使用的时候若是没有加别名那就代表是来自于没有别名的约束文件
例如 table(表格) 给他起个别名 xmlns:a="..."
在案例中使用 a:table 代表的是表格
若在案例中直接使用 table 代表的是桌子
ps:在一个xml文件中只能有一个不起别名;
注意:
schema约束本身也是xml文件.
名称空间/包
名称空间/包:
XML文件允许自定义标记,所以可能出现同名字的标记,为了区分这些标记,就需要使用名称空间。①类似JAVA里的不同包名的相同类- 名称空间的目的是有效的区分相同的标记,其实并不真实存在。
- 语法:
①
声明有前缀的名称空间 xmlns:前缀名=名称空间的名字②声明无前缀的名称空间 xmlns=名称空间的名字 (缺省)
当在 XML 中使用前缀时,一个所谓的用于前缀的命名空间必须被定义。
命名空间是在元素的开始标签的 xmlns 属性中定义的。
命名空间声明的语法如下。xmlns:前缀="URI"。
<root>
<h:table xmlns:h="http://www.w3.org/TR/html4/">
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table xmlns:f="http://www.w3cschool.cc/furniture">
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
在上面的实例中,<table> 标签的 xmlns 属性定义了 h: 和 f: 前缀的合格命名空间。
当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。
命名空间,可以在他们被使用的元素中或者在 XML 根元素中声明:
<root xmlns:h="http://www.w3.org/TR/html4/"
xmlns:f="http://www.w3cschool.cc/furniture">
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>
- 注意:
①
当且仅当它们的名字相同时称两个名称空间相同,也就是说对于有前缀的名称空间,如果两个名称空间的名字相同,即使前缀不相同也是相同的名称空间,返之同然。 ②前缀只是方便引用而已。
SpringMVC配置文件举例:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:websocket="http://www.springframework.org/schema/websocket"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/websocket http://www.springframework.org/schema/websocket/spring-websocket-4.0.xsd">
</beans>