xml:可扩展标记语言,类似于HTML,用于传输或者描述数据
XML
应用
- 在客户端(client)/服务器(server)之间传递数据
 - 用来保存有关系的数据
 - 用来做配置文件,在Android当中的布局文件和清单文件
 
语法
文档声明
- 声明必须在第一行,最简单的声明
<?xml version="1.0"?> - encoding属性用于指定编码格式
<?xml version="1.0" encoding="utf-8"?> - standalone属性说明文档是否独立,即是否依赖于其他文档
<?xml version="1.0" standalone="yes"?> 
元素
- xml文档中出现的标签,成对出现
 - 如果包含主体,则用以下形式
<tag>content</tag> - 如果不包含主体,则可以使用如下形式
<tag /> - 标签中可以嵌套,不允许交叉嵌套
 - xml中必须且只能有一个根标签
 - xml中不会忽略主题中出现的空格和换行
 - 命名规范:区分大小写,不能以数字和_开头,不能以XML(Xml,xml等)开头,不能包含空格,名称中间不能有冒号
 - 属性:一个元素可以有多个属性,每个属性都有自己的名称和取值,用单引号或者双引号。e.g.
<mytag name="value" .../>,属性不允许重复,也可用子标签来表示 
注释
- 格式
<!--注释--\> 
CDATA
- 所有XML中的文本均会被解析器解析,只有CDATA区段中的文本会被解析器忽略。
 - 语法
<![CDATA[ content ]]\> 
特殊字符
| 特殊字符 | 替代符号 | 
|---|---|
& | 
& | 
< | 
< | 
> | 
> | 
" | 
" | 
' | 
' | 
XML约束
- 由于标签都是自定义的,若出现错误将无法正确读取xml文件信息。
 - 用来约束xml书写规范的文档称之为约束文档
- 格式良好的xml文档:遵循XML语法的XML
 - 有效的XML:遵循约束文档的XML
 
 - 约束文档定义了XML中允许出现的元素名称,属性及元素出现的顺序等。
 
常用的约束技术
XML DTD
- Document Type Definition(文档类型定义)
 - 约束XML的书写规范
 dtd可以写在单独的文件中,扩展名为dtd,必须使用UTF-8编码(此时为外部),如果为内部文档则不一定要为UTF-8
- 文件清单
1
2
3
4
5
6
7
8
9
10
11
12
13
14 
- 文件清单
 引入外部DTD文档
- XML使用DOCTYPE语句指明它遵循的DTD文档有两种形式
- 1.当引用的DTD文档在本地时,采用
<!DOCTYPE 根元素 SYSTEM "DTD名称"\> - 2.当引用的DTD文档在公共网络上时,采用
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档URL"\> 
 - 1.当引用的DTD文档在本地时,采用
 
- XML使用DOCTYPE语句指明它遵循的DTD文档有两种形式
 - 在XML内部编写DTD
 e.g.
1
2
3
4
5
6
7
8
9
10
11
12
13DTD-定义元素
- 在DTD文档中使用ELEMENT关键字来声明一个XML元素
 - 语法:<!ELEMENT 元素名称 使用规则>
- 使用规则:
- (#PCDATA):指示元素的主体内容只能是普通文本(parsed character Data)。
 - EMPTY:用于指示元素的主体内容。
 - ANY:用于指示元素的主题内容为任意类型。
 - (子元素):指示元素中包含的子元素。
 
 - 定义子元素及描述他们之间的关系
- 如果子元素用逗号分开,说明必须按照声明的顺序去编写XML文档
 - 如果子元素用 “
|“ 分开,说明任远其一 - 用 
+*?来表示元素出现的次数- 如果子元素后面没有 
+*?说明必须出现一次 +表示至少出现一次*表示可有可无- ? 表示0次或1次
 
 - 如果子元素后面没有 
 
 
 - 使用规则:
 
- DTD-定义属性
- 在DTD文档中使用ATTLIST关键字来为一个元素声明属性
 - 语法:
<!ATTLIST 元素名称 属性1 属性值类型 设置说明···> - 属性值类型
- CDATA:表明属性的取值为普通文本字符串
 - (a|b|c)说明只能从其中任选其一
 - ID 表示属性的取值不能重复
 
 - 设置说明
- #REQUIRED:表示该属性必须出现
 - #IMPLIED:表示该属性可有可无
 - #FIXED:表示属性的取值为一个固定值 语法:#FIXED “固定值”
 
 
 DTD-定义引用实体
- 概念:在DTD中定义,在XML中使用
 - 语法:<!ENTITY 实体名称 “实体内容”>
 - 引用方式(主义实在XML中使用):&实体名称
 - e.g.
1
2
3
4DTD中定义:
<!ENTITY copyright "cj5785">
XML中引用
©right 
DTD-定义参数实体
- 概念:在DTD中定义,在DTD中使用
 - 语法:<!ENTITY %实体名称 “实体内容”>
 - 引用方式(注意是在DTD中使用):%实体名称
 - e.g.
1
2
3
4
5DTD中定义
<!ENTITY %TAG_NAME "姓名|EMAIL|电话|地址">
DTD中引用
<!ENTITY 个人信息 (%TAG_NAME;|生日)>
<!ENTITY 客户信息 (%TAG_NAME;|公司名)> 
XML Schema
- 也是一种用于定义和描述XML文档结构与内容的模式语言,其出现是为了克服DTD的缺陷
 - XML Schema VS DTD
- XML Schema符合XML语法规范
 - DOM,SAX等XML API很容易解析出XML Schema文档中的内容
 - XML Schema对名称空间支持的非常好
 - XML Schema比XML DTD支持更多的数据类型,并支持用户自定义的数据类型
 - XML Schema定义约束的能力非常强大,可以对XML实例文档做出细致的语义限制
 - XML Schema不能像DTD一样定义实体,比DTD复杂,但XML Schema现在是W3C组织的标准,正在逐步取代DTD
 
 - 名称空间 namespace 对应一个约束文档
 Schema约束
- XML Schema文件自身就是一个XML文件,但它的拓展名通常为.xsd
 - 一个XML Schema文档通常称之为模式文档(约束文档),遵循这个文档书写的XML称之为实例文档
 - 和XML文件一样,一个XML Schema文档也必须有一个根节点,但这个根节点的名字为schema
 - 编写了一个XML Schema约束文件后,通常需要把这个文件中声明的元素绑定到一个URI地址上,在XML Schema技术中有一个专业术语来描述这个过程,即把XML Schema文档声明中的元素绑定到一个名称空间上,以后XML文件可以通过这个URI(即名称空间)来告诉解析引擎,XML文件中编写的元素来自哪里,被谁约束
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.cj5785.com"
elementFromDefault="qualified">
<xs:element name='书架'>
<xs:complexType>
<xs:sequence maxOccurs='unbounded'>
<xs:element name='书'>
<xs:complexType>
<xs:sequence>
<xs:element name='书名' type='xs:string' />
<xs:element name='作者' type='xs:string' />
<xs:element name='售价' type='xs:string' />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema> 
XDR(已不再使用)
- SOX(已不再使用)
 
XML解析
解析的xml文档内容
1  | 
  | 
Dom解析

- DOM解析
- 根据xml层级结构在内存中会分配一个树形结构
 - 在XML DOM每个元素都会被解析成一个节点Node,而常用的节点类型又分为:
- 元素节点 Element
 - 属性节点 Attr
 - 文本节点 Text
 - 文档节点 Document
 
 
 - Dom解析xml的优缺点
- 优点:因为分配了一个树形结构,很方便的实现了增加,修改和删除的操作。
 - 缺点:如果要解析的文件过大,一次性在内存中分配一个树形结构,造成内存的溢出。
 
 - DOM & SAX解析开发包
- JAXP是sun公司推出的解析标准实现
 - Dom4j:开源组织推出的解析开发包
 - JAXP:(Java API for XML Processing)开发包是JavaSE的一部分,它由以下几个包及其子包组成:
- org.w3c.dom:提供DOM方式解析XML的标准接口
 - org.xml.sax:提供SAX方式解析XML的标准接口
 - javax.xml:提供了解析XML文档的类
 
 - java.xml.parsers包中,定义了几个工厂类,用来获得DOM和SAX解析器对象
- DocumentBuilderFactory
 - SAXParserFactory

 
 
 - 1.把整个文档先加载到内存中->Document所以可以对文档进行修改
 - 2.如果文件比较大,则可能导致内存溢出
 - 编程思路:
DocumentBuilderFactory -> DocumentBuilder -> Document -> 通过节点获得NodeList -> 具体的Node - 如果想修改
TransformerFactory -> Transformer -> transform(xmlSource , outputTarget) 
1  | public void domParse() throws Exception{  | 
Sax解析
- 解析方式:边读边解析
 - 当使用sax方式读到特定标签的时候,自动调用相应的方法进行操作。
 - sax解析的优缺点
- 优点:不会造成内存的溢出
 - 缺点:不能修改xml文件
 
 - 解析的xml文档内容
 
1  | package domtest;  | 
- book.java (java bean)
 
1  | public class Book {  | 
- 用sax解析将其解析为集合
 
1  | public void saxParse2list() throws Exception {  | 
Pull解析
- 首先导入pull的jar包(两个jar包
kxml.jar和xmlpull.jar),其原理其实就是sax解析。但pull解析可以在任意位置停止,而sax解析必须全部解析完成 - 使用pull解析xml文件把xml中的内容放到集合中去
 - 步骤:
- 1.创建解析器工厂
 - 2.根据解析器工厂创建解析器
 - 3.把要操作的文件放到解析器里面
 
 - 示例
 
1  | public void pullTest() throws Exception {  |