Xml
eXtendsible markup language 可扩展的标记语言
XML 有什么用?
可以用来保存数据
可以用来做配置文件
数据传输载体
##定义xml
其实就是一个文件,文件的后缀为 .xml
###. 文档声明
简单声明, version : 解析这个xml的时候,使用什么版本的解析器解析 <?xml version="1.0" ?> encoding : 解析xml中的文字的时候,使用什么编码来翻译 <?xml version="1.0" encoding="gbk" ?> standalone : no - 该文档会依赖关联其他文档 , yes-- 这是一个独立的文档 <?xml version="1.0" encoding="gbk" standalone="no" ?>
###encoding详解
在解析这个xml的时候,使用什么编码去解析。 ---解码。
文字, 而是存储这些文字对应的二进制 。 那么这些文字对应的二进制到底是多少呢? 根据文件使用的编码 来得到。
默认文件保存的时候,使用的是GBK的编码保存。
所以要想让我们的xml能够正常的显示中文,有两种解决办法
-
让encoding也是GBK 或者 gb2312 .
-
如果encoding是 utf-8 , 那么保存文件的时候也必须使用utf-8
-
保存的时候见到的ANSI 对应的其实是我们的本地编码 GBK。
为了通用,建议使用UTF-8编码保存,以及encoding 都是 utf-8
元素定义(标签)
-
其实就是里面的标签, <> 括起来的都叫元素 。 成对出现。 如下:
<stu> </stu>
-
文档声明下来的第一个元素叫做根元素 (根标签)
-
标签里面可以嵌套标签
-
空标签
既是开始也是结束。 一般配合属性来用。 <age/>
<stu> <name>张三</name> <age/> </stu>
-
标签可以自定义。
XML 命名规则 XML 元素必须遵循以下命名规则:
名称可以含字母、数字以及其他的字符 名称不能以数字或者标点符号开始 名称不能以字符 “xml”(或者 XML、Xml)开始 名称不能包含空格
命名尽量简单,做到见名知义
简单元素 & 复杂元素
-
简单元素
元素里面包含了普通的文字
-
复杂元素
元素里面还可以嵌套其他的元素
属性的定义
定义在元素里面, <元素名称 属性名称="属性的值"></元素名称> <stus> <stu id="10086"> <name>张三</name> <age>18</age> </stu> <stu id="10087"> <name>李四</name> <age>28</age> </stu> </stus>
- xml注释:
与html的注释一样。
<!-- --> 如: <?xml version="1.0" encoding="UTF-8"?> <!-- //这里有两个学生 //一个学生,名字叫张三, 年龄18岁, 学号:10086 //另外一个学生叫李四 。。。 -->
xml的注释,不允许放置在文档的第一行。 必须在文档声明的下面。
xml解析方式
有很多种方式,常用两种。
-
DOM
-
SAX
DOM和SAX解析xml的不同
- dom是基于内存的,把xml读到内存中,消耗很大的内存空间;
- SAX是基于事件驱动的方式,事件被触发时,获取相应的xml数据解析
- dom可以向xml插入数据,SAX不可以
- dom可以随机访问,SAX不可以
DOM:document object model 把整个xml全部读取到内存,形成树状结构。整个文档称之为document对象,属性对应Attribute对象,所有的元素节点对应Element对象,文本也可以称之为Text对象,以上所有的对象都可以称之为Node节点。
Dom4j
是一个简单、灵活的开源库,前身是 JDOM。与 JDOM 所不同的是,DOM4j 使用接口和抽象类基本方法,用了大量的 Collections 类,提供一些替代方法以允许更好的性能或更直接的编码方法。DOM4j 不仅可以读取 XML 文件,而且还可以写入 XML 文件。
基本用法
element.element("stu") : 返回该元素下的第一个stu元素
element.elements(); 返回该元素下的所有子元素。
-
创建SaxReader对象
-
指定解析的xml
-
获取根元素。
-
根据根元素获取子元素或者下面的子孙元素
try {
//1. 创建sax读取对象
SAXReader reader = new SAXReader();
//2. 指定解析的xml源
Document document = reader.read(new File("D:/test.xml"));
//3. 得到元素、
//得到根元素
Element rootElement= document.getRootElement();
//获取根元素下面的子元素 age
//rootElement.element("age")
//System.out.println(rootElement.element("stu").element("age").getText());
//获取根元素下面的所有子元素 。 stu元素
List<Element> elements = rootElement.elements();
//遍历所有的stu元素
for (Element element : elements) {
//获取stu元素下面的name元素
String name = element.element("name").getText();
String age = element.element("age").getText();
String address = element.element("address").getText();
System.out.println("name="+name+"==age+"+age+"==address="+address);
}
} catch (Exception e) {
e.printStackTrace();
}
xml约束
DTD
通过 DTD,您的每一个 XML 文件均可携带一个有关其自身格式的描述。
通过 DTD,独立的团体可一致地使用某个标准的 DTD 来交换数据。
而您的应用程序也可使用某个标准的 DTD 来验证从外部接收到的数据。
您还可以使用 DTD 来验证您自身的数据。
1.可以引用网络上的DTD
2.直接引入本地得DTD
3.直接在XML里面嵌入DTD的约束规则
Schema
其实就是一个xml , 使用xml的语法规则, xml解析器解析起来比较方便 , 是为了替代DTD 。
但是Schema 约束文本内容比DTD的内容还要多。 所以目前也没有真正意义上的替代DTD
Schema和DTD的区别
Schema是对XML文档结构的定义和描述,其主要的作用是用来约束XML文件,并验证XML文件有效性。DTD的作用是定义XML的合法构建模块,它使用一系列的合法元素来定义文档结构。它们之间的区别有下面几点:
1、Schema本身也是XML文档,DTD定义跟XML没有什么关系,Schema在理解和实际应用有很多的好处。
2、DTD文档的结构是“平铺型”的,如果定义复杂的XML文档,很难把握各元素之间的嵌套关系;Schema文档结构性强,各元素之间的嵌套关系非常直观。
3、DTD只能指定元素含有文本,不能定义元素文本的具体类型,如字符型、整型、日期型、自定义类型等。Schema在这方面比DTD强大。
4、Schema支持元素节点顺序的描述,DTD没有提供无序情况的描述,要定义无序必需穷举排列的所有情况。Schema可以利用xs:all来表示无序的情况。
5、对命名空间的支持。DTD无法利用XML的命名空间,Schema很好满足命名空间。并且,Schema还提供了include和import两种引用命名空间的方法。