介绍
XML全称为Extensible Markup Language,意思是可扩展的标记语言,通常只使用1.0版本。
作用:
1、存放数据
2、配置文件
要求:
1.必须要有文档声明
a.以<?xml开头 以?>结尾
b.文档声明必须要从第一个字符开始
c.文档声明只有2个属性 version=“1.0” (1.1) encoding=“UTF-8”
2.必须要有根节点
a.文档中的所有节点都是成对出现的 或者单个带结束符 /
成对出现标签名称必须要完全一样,尾标签要加/,命名规则 和java中变量类似,支持中文(外部闭合)
单个标签以/结尾(内部闭合)
可以嵌套但是不允许交叉,同一个节点中的节点必须要完整
b.根节点 同层唯一的,最大的,最顶层的节点
3.有合格的元素和属性
a.属性必须要写在开始节点中
b.一般情况属性都是键值对,键是字符串不加引号,值也是字符串要加引号(单双引号都支持)
c.单个标签中属性要唯一
4.要有正确的注释 <!-- -->
5.转义字符(重点) 本身字符含义被占用需要转义
批量实现文本转义CDATA 文本区域
6.xml要以.xml结尾
约束:
1.DTD约束
在文档声明中添加dtd约束 (DOCTYPE 中添加)
DOCTYPE 中指明的节点是当前文档的根节点
<!ELEMENT beans (bean*,import*)>
a.ELEMENT代表节点的定义 beans 代表节点的名称
括号代表包含bean,import
, 表示两个元素之间关系,为顺序
| 表示两个元素之间关系,为选中
* 表示当前修饰出现次数,为任意
+ 表示当前修饰出现次数,为至少有一个(>=0)
? 表示当前修饰出现次数,为0或1
#PCDATA代表内容是文本
<!ATTLIST bean id CDATA #REQUIRED className CDATA #REQUIRED >
2.ATTLIST代表节点的属性定义
bean代表节点的名称
id和className都是属性的名称 CDATA代表文本 #REQUIRED代表必填
属性的类型 CDATA代表文本,ID类型代表元素唯一,枚举(e1|e2)
属性的约束 #REQUIRED 表示必须 #IMPLIED 表示可选
2.Schema约束(用XML来约束XML)
Schema是新的XML文档约束功能更强大,数据类型更完善且支持名称空间,是DTD 替代者;其本身也是XML文档,但Schema文档的扩展名为xsd,而不是xml。
a.以.xsd结尾
b.schema约束引用的地方是根节点
c.命名空间通过xmlns 来指定(xmlns代表默认),如果xmlns后面使用别名,xml使用的位置全部都要使用别名
d.element代表节点,schema中的嵌套关系就是现实节点的嵌套关系
e.定义类型描述 complexType(复杂类型) ,simpleType(简单类型)
f.如果有子标签
<choice>选择,
<sequence>顺序,
<all>任意
minOccurs最少出现次数
maxOccurs最大出现次数,unbounded不限制(没有边)
g.<attribute> 定义属性,要求要在element节点内 name代表属性的名称 use设置属性使用(required:必填 optional:可选)
解析
开发中比较常见的解析方式有三种,如下:
- DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象。
a) 优点:元素与元素之间保留结构关系,故可以进行增删改查操作。
b) 缺点:XML文档过大,可能出现内存溢出显现。 - SAX:是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都将触发对应的事件。
a) 优点:处理速度快,可以处理大文件
b) 缺点:只能读,逐行后将释放资源。 - PULL:Android内置的XML解析方式,类似SAX。
解析器:就是根据不同的解析方式提供的具体实现。有的解析器操作过于繁琐,为了方便开发人员,有提供易于操作的解析开发包。
常见的解析开发包:
JAXP:sun公司提供支持DOM和SAX开发包
JDom:dom4j兄弟
jsoup:一种处理HTML特定解析开发包
dom4j:比较常用的解析开发包,hibernate底层采用。
domj4解析:
常用API如下:
- SaxReader对象
a) read(…) 加载执行xml文档 - Document对象
a) getRootElement() 获得根元素 - Element对象
a) elements(…) 获得指定名称的所有子元素。可以不指定名称
b) element(…) 获得指定名称第一个子元素。可以不指定名称
c) getName() 获得当前元素的元素名
d) attributeValue(…) 获得指定属性名的属性值
e) elementText(…) 获得指定名称子元素的文本值
f) getText() 获得当前元素的文本内容
public void testParse() throws DocumentException{
//1.核心类
SAXReader saxReader = new SAXReader();
//2.获得Document(整个xml)
Document document = saxReader.read("beans.xml");
//3.获得根元素 beans
Element rootElement = document.getRootElement();
//4.所有子元素 bean
List<Element> allBeanElement = rootElement.elements("bean");
for (Element beanEle : allBeanElement) {
//4.1 bean属性
String id = beanEle.attributeValue("id");
String className = beanEle.attributeValue("className");
System.out.println("bean属性:" + id + " , " + className);
//5.子元素property
List<Element> allPropElement = beanEle.elements("property");
for (Element propEle : allPropElement) {
String name = propEle.attributeValue("name");
String value = propEle.attributeValue("value");
System.out.println("property属性:" + name + " , " + value);
}
System.out.println();
}
}
329

被折叠的 条评论
为什么被折叠?



