Part01 :XML概述
1、XML:可扩展的标记语言。
- 可扩展的:扩展性特别强,语法上比较松
- 标记:如:
2、XML的作用:
- 存放数据
- 配置文件
3、XML语法:
- 文档声明:<?xml version=“1.0" encoding="UTF-8"?>
- 文档声明必须以<?xml开头,以?>结束,中间没有空格
- 文档声明必须从文档的0行0列位置开始
- 文档声明只有两个属性,格式:属性名=“属性值”,属性值必须使用”"
- version:指定XML文档版本。必须属性,一般使用1.0
- encoding:指定当前文档的编码。可选属性,默认值为UTF-8。
- 注释:
<!--注释写这里面,可以单行也可以多行 -->
- 元素(Element)/标签(Tag):
- 普通元素的结构由开始标签、元素体和结束标签组成。如:
<a>你好</a>
- 元素体可以写也可以不写,当标签没有元素体的时候可以使用自闭和标签<标签名/>
- 元素体里面可以是文本也可以写其他标签
- 元素命名:
- 区分大小写
- 不能使用空格,冒号第特殊字符
- 不建议以XML、xml、Xml开头
- 格式化良好的xml文档,必须只有一个根元素
- 普通元素的结构由开始标签、元素体和结束标签组成。如:
- 属性:attribute
- 属性是元素的一部分,它必须出现在元素的开始标签中
- 属性的定义格式:属性名=“属性值”,其中属性值必须使用单引号或双引号
- 一个元素可以有0-N个属性,但一个元素中不能出现同名属性
- 属性名不能使用空格,冒号第特殊字符,且必须以字母开头
- 转义字符:
- CDATA区:<![CDATA[大量需要转译的字符]]>
- 当内容中出现了大量需要转译的字符时,xml提供CDATA区自动转译
Part02:XML约束
1、XML约束
- 在XML技术中,可以编写一个文档来约束一个XML文档的书写规范,称为XML约束;
- 常见的XML约束:DTD约束、Schema约束
2、根据DTD约束写XML文档:
- 在自己要编写的XML文档中引入DTD约束文件
- 引入语法一般在DTD文档开头的注释中
- 如:第一个xx表示根标签名,后面为DTD约束名
- 符号和意思:
- ?:表示该标签出现的次数是0或者1;
- *:表示该标签出现的次数是任意次;
- +:表示该标签出现的次数大于等于1;
- |:表示多个标签选一个出现;
- ,:表示多个标签必须按照先后顺序出现
3、三种DTD约束:
- 内部DTD,在XML文档内部嵌入DTD,只对当前XML有效
- 外部DTD-本地DTD,DTD文档在本地系统上,公司内部自己项目使用
- 外部DTD-公共DTD,DTD文档在网络上,一般由框架提供
4、Schema约束:
- Schema约束是新的XML文档约束,比DTD强大很多,是DTD替代者
- Schema约束本身也是XML文档,但是Schema约束的扩展名为xsd
- Schema约束功能更强大,数据类型更完善
- Schema约束支持名称空间(类似Java的包)
5、根据Schema约束写XML文档: - 在自己要编写的XML文档中引入DTD约束文件
- 引入语法一般在Schema约束文档开头的注释中
- 引入的为XML文档中的根标签的开始标签,自己补齐结束标签和元素体
Part03:XML解析
1、XML解析概述:
当将数据存储在XML后,我们就希望通过程序获得XML的内容。因此,人们为不同问题提供不同的解析方式,并提交对应的解析器,方便开发人员操作XML。
2、解析方式和解析器:
- 开发中常见的解析方式:
- DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象。
- 优点:元素与元素之间保留结构关系,可以进行增删改查操作;
- 缺点:XML文档过大时,可能出现内存溢出现象;
- SAX:是一种速度更快,更有效的方法。它逐行扫描文件,一边扫描一遍解析。并以事件驱动的方式进行具体解析,每解析一行,都将触发对应的事件。
- 优点:处理速度快,可以处理大文件。
- 缺点:只能读,逐行解析后将释放资源。
- PULL:Android内置的XML解析方式,类似SAX。
- DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象。
- 解析器:就是根据不同的解析方式提供的具体实现。有的解析器过于繁琐,为了方便开发,又提供易于操作的解析开发包。
- 常见的解析开发包:
- JAXP:sun公司提供的支持DOM和SAX开发包;
- JDom:dom4j兄弟开发的;
- jsoup:一种处理HTML特定解析开发包;
- Dom4J :比较常用的解析开发包,hibernate底层采用;
3、使用Dom4J的API解析XML文件
-
1.把整个要解析的XML文件加载到内存(Dom4J提供了一个核心类SAXReader,用来加载XML文件)
-
2.通过SAXReader的read()方法获取Document对象
-
3.通过Document对象的getRootElement()方法获取根标签
-
4.通过根标签的attributeValue(属性名)获取根标签的属性值
-
5.通过根标签的elements方法获取根标签的子标签集合
-
6.遍历子标签集合
//把整个要解析的XML文件加载到内存 SAXReader reader = new SAXReader(); //获取Document对象 Document document = reader.read(new File("beans.xml")); //获取根标签 Element rootEle = document.getRootElement(); //获取根标签的属性 String value = rootEle.attributeValue("name"); System.out.println(value); //获取根标签的子标签,集合 List<Element> beanElements = rootEle.elements(); //遍历子标签bean集合 for (Element e1:beanElements ) { //获取子标签bean的名字 System.out.println(e1.getName()); //获取子标签bean的属性 String idValue = e1.attributeValue("id"); String classNameValue = e1.attributeValue("className"); System.out.println(idValue+":"+classNameValue); //获取子标签bean的子标签property集合 List<Element> propertyElements = e1.elements(); //遍历子标签property集合 for (Element e2:propertyElements ) { //获取字标签property的名字 System.out.println(e2.getName()); //获取子标签property的属性 String nameValue = e2.attributeValue("name"); String valueValue = e2.attributeValue("value"); System.out.println(nameValue+":"+valueValue); } }