目录
Xml介绍
一、why(用来干什么)
1.数据存储 (Android 通讯录)
2.配置文件
3.数据传输(现在以JSON为主)
二、what
1.概念:
是一种可拓展标记语言,可以用一系列的标签来对数据进行描述。
拓展,指的是用户可以自定义标签
2.XML 和 HTML对比:
(1993年)HTML超文本标记语言 , (1998年)w3c组织推出XML可拓展标记语言
-
XML 主要是用来描述数据的
-
HTML 主要是用来展现数据的
三、how
1.XML语法
1.1文档声明部分
<?xml version="1.0" encoding="UTF-8" ?>
1.2元素
元素,指的就是XML中的标记,这种标记也被称为标签、节点。
元素规范
-
不能以数字或部分标点符号开头 (_)
-
不能包含空格和特定的几个符号(:)
-
标签必须成对出现,不允许缺省结束标签
-
根元素有且只有一个(树结构)
-
大小写敏感
-
允许多层嵌套但是不允许交叉嵌套
注意:对于XML标签中出现的空格和换行,在XML解析程序都会当作标签内容进行处理。
1.3属性
属性基本格式:
<元素名 属性名="属性值" 属性名='属性值'>
-
注意:这里属性值必须加引号,可以是单引号,也可以是双引号【外双内单,外单内双(外面是双引号,里面就是单引号,外面是单引号,里面就是双引号)】
-
注意:使用标签还是属性来描述数据 , 对此没有强制的要求
1.4实体
格式:&实体名;
预定义实体
实体 | 字符 | 简介 |
< | < | Less than |
> | > | Greather than |
& | & | mpersand |
' | ' | Apostrophe |
" | " | quotation mark |
自定义实体
格式:
<!DOCTYPE 根元素名称[ <!ENTITY 实体名 实体内容> ]>
1.5注释
<!-- 注释 -->
1.6CDATA
概念:XML 解析器,会解析 XML 文档中所有的文本。 当某个 XML 元素被解析时,其标签之间的文本也会被解析。
-
解析器进行解析的内容,称为PCDATA(Parsed CDATA)
-
解析器不会解析的内容,称为CDATA,(Character Data)
语法:
<![CDATA[需要原样输出的字符串]]>
2.XML约束
2.1目的
为了不让用户去随意的定义标签,这是就要对XML的文件内容做出约束 , 就是为了让用户按照我们提前设置好的要求, 去编写XML内容。
2.2良构和有效
-
良构的xml只要符合语法结构即可
-
有效的xml,既要符合语法结构并且符合实际要求
有效包含良构
-
良构的XML文件不一定是有效的
-
有效的XML文件一定是良构的
2.3DTD
使用DTD规定了元素、属性和其他内容在xml文档中的使用规则
描述元素的语法格式:
<!ELEMENT 元素名 (内容模式)>
-
EMPTY:元素之间不能写内容(空元素)
-
(#PCDATA):可以包含内容,但是不能包含任何子元素
-
ANY:元素内容为任意的,主要是使用在元素内容不确定的情况下
-
修饰符:() | + * ? , (元素和属性通用)
() 用来给元素分用组
| 在列出的元素中选择一个
+表示该元素最少出现一次,可以出现多次 (1或n次)
*表示该元素允许出现零次到任意多次(0到n次)
?表示该元素可以出现,但只能出现一次 (0到1次)
,对象必须按指定的顺序出现
描述属性的语法格式:
<!ATTLIST 元素名称 属性名称 属性类型 属性特点 属性名称 属性类型 属性特点>
属性类型:
-
CDATA:属性值可以是任何字符(包括数字和中文)
-
ID:属性值必须唯一,属性值必须满足xml命名规则
-
IDREF:属性的值指向文档中其它地方声明的ID类型的值。
-
IDREFS:同IDREF,但是可以具有由空格分开的多个引用。
-
enumerated:(枚举值1|枚举值2|枚举值3...),属性值必须在枚举值中
属性特点:
-
#REQUIRED:元素的所有示例都必须有该属性
-
#IMPLIED :属性可以不出现
-
default-value:属性可以不出现,但是会有默认值
-
#FIXED :属性可以不出现,但是如果出现的话必须是指定的属性值
2.4引入
-
DTD和XML在同一个文件中
-
外部的DTD,DTD和xml文档不在同一个文件中。(常用)
外部引入的方式:
-
本地DTD文件引入,这种方式一般都是自己编写DTD,然后自己使用。
<!DOCTYPE students SYSTEM "dtd/students.dtd">
-
公共DTD文件引入,这种方式可以让很多人使用共同的一个DTD文件。
3.xml解析
3.1 dom解析
使用情况:
数据量小的xml使用dom(要整个装载 , 对内存要求高)
概述:
使用DOM方式解析,要求解析器把整个XML文档装载到一个Document对象中。Document对象包含文档元素,即根元素,根元素包含N个子元素。
根据DOM的定义,XML 文档中的每个元素都是一个节点(Node):
-
XML文档只有一个根节点
-
XML中每个元素都是一个元素节点
-
XML中每个文本都是一个文本节点
-
XML中每个属性都是一个属性节点
-
XML中每个注释都是一个注释节点
解析步骤:
-
调用 DocumentBuilderFactory.newInstance() 方法得到创建 DOM 解析器的工厂
-
调用工厂对象的 newDocumentBuilder 方法得到 DOM 解析器对象
-
调用 DOM 解析器对象的 parse() 方法解析 XML 文档 parse() 方法会返回解析得到的 Document 对象
-
然后根据文档的结构关系和特点,调用相应的API,对其进行解析
3.2 sax解析
使用情况:
数据量大的xml使用sax
概述:
使用SAX方式解析,每当读取一个开始标签、结束标签或者文本内容的时候,都会调用我们重写的 一个指定方法,该方法中编写当前需要完成的解析操作。
直到XML文档读取结束,在整个过程中,SAX解 析方法 不会在内存中保存节点的信息和关系。
-
使用SAX解析方式,不会占用大量内存来保存XML文档数据和关系,效率高。
-
但是在解析过程中,不会保存节点信息和关系,并且只能从前往后,顺序读取、解析。
解析步骤:
-
获取SAXParserFactory工厂类对象,SAXParserFactory.newInstance()
-
使用工厂对象,创建出SAX解析器,saxParserFactory.newSAXParser()
-
调用解析器的parse() 解析xml文件,然后重写DefaultHandler类中的方法,进行事件处理 saxParser.parse(filePath, new DefaultHandler(){...}
DOM4J
概述
Dom4j 是一个Java的XML API,用来读写XML文件的,它是一个十分优秀的Java XML API,具有性能 优 异、功能强大和极其易使用的特点,且开源免费。