Xml
extendsible mwrkup language 可扩展的标记语言
XML 有什么用?
①可以用来保存数据
②可以用来配置文件
③数据传输载体
定义xml
1.文档说明
-
简单声明,version: 解析这个xml的时候,使用什么版本的解析器解析
<?xml version="1.0" ?>
-
encoding : 解析xml中的文字时,使用什么编码来翻译
<?xml version="1.0" encoding="UTF-8" ?>
-
standalone : no - 该文档会依赖关联其他文档,yes - 这是一个独立的文档
<?xml version="1.0" encoding="UTF-8" ? standalone="no">
2.encoding详解
解析xml时,使用什么编码解析 --解码
存储的文字所对应的二进制,是根据文件所使用的编码来得到的
默认文件保存的时候,使用的是GBK的编码保存
- 所以要想让我们的xml能够正常的显示中文,有两种解决方法:
①让encodiong是gdk,或gb2312
②如果encoding是utf-8,那么保存文件的时候也必须使用utf-8
保存的时候见到的ANSI对应的其实是我们本地编码GBK`
3.元素定义
①其实就是标签,<>括起来的都叫元素。标签都是成对出现的,如
②文档声明下的第一个元素叫做根元素(根标签)
③标签里面可以嵌套标签
④空标签
即是开始,也是结束,一般配合属性来用
<stu>
<name>张三</stu>
<age/>
</stu>
⑤标签可以自定义
命名规则:
名称可以含字母、数字以及其他字符
名称不能以数字或者标点符号开始
名称不能包含空格
4.简单元素 & 复杂元素
- 简单元素
元素里面包含了普通的文字
- 复杂元素
元素里面还可以嵌套其他的元素
5.属性的定义
定义在元素里面,<元素名称 属性名称=“属性的值”><元素名称/>
<stu id="10001">
<name>张三</name>
</stu>
6.注释
与html的注释一样
<!-- -->
如: <!-- 这是一条注释 -->
xml的注释,不允许放置在文档的第一行,必须在文档声明的下面
CDATA区
- 非法字符
严格的讲,在xml中仅有字符“<”和“&”是非法的。可将其替换为实体引用
< <
& &
如果某段字符串里面有过多的字符,并且里面包含了类似标签或者关键字,不想让xml的解析器去解析,可以使用CDATA来包装。
<![CDATA[]]> 如:<dress><![CDATA[<a href="http://baidu.com">百度</a>]]><dress/>
XML 解析
其实就是获取元素里面的字符数据或者属性数据
1.解析方式
有多种,常用的有两种
- DOM
DOM : dociment.把整xml全部读到内存中,形成树状结构。整个文档称之为document对象,属性对应Attribute对象,所有的元素结点对应Element对象,文件也可称之为Text对象,以上所有的对象可以称之为Node节点。如果xml特别大,讲造成内存溢出。可以对数据进行增删操作。
- SAX
SAX : Simple API for xml 基于事件驱动。读一行,解析一行。不会造成内存溢出,不可以进行增删,只能查询。
2.Dom4j 基本用法
<stu>
<name>张三</name>
<age>18</age>
<adress>北京</adress>
</stu>
<stu>
<name>李四</name>
<age>17</age>
<adress>上海</adress>
</stu>
<!-- 1.创建sax读取对象 -->
SAXReader reader = new SAXReader();
<!-- 2.指定解析的xml源 -->
Document document = reader.read(new file("src/xml"));
<!-- 3.得到根元素 -->
ELement rootElement = document.getRootElement();
<!-- 4.获取根元素下的子元素age -->
rootELement.emelent("stu").element("age").getText();
<!-- 5.遍历所有stu子元素 -->
for(Element element : elements){
String name = element.element("name").getText();
String age = element.element("age").getText();
String address = element.element("address").getText();
}
3.Dom4j 的 Xpath使用
dome4j里面支持Xpath的写法。Xpath其实是xml的语言路径,支持我们在解析xml的时候,能够快速的定位到具体的某一个元素。
①添加jar包支持
②在查找制定节点是,根据Xpath语法规则来查找
③后续的代码与之前的解析代码一样
4.XML 约束
DTD元素
<!ELEMENT 元素名称 (#PCDATA)>
--简单元素
<!ELEMENT 元素名称 (子元素名称 1,子元素名称 2,.....)>
--带有子元素(序列)的元素,有顺序要求
<!ELEMENT 元素名称 (子元素名称 1|子元素名称 2)>
--声明“非…/既…”类型的内容
<!ELEMENT 元素名称 (子元素名称+)>
--声明最少出现一次的元素
<!ELEMENT 元素名称 (子元素名称*)>
--声明出现零次或多次的元素
<!ELEMENT 元素名称 (子元素名称?)>
--声明出现零次或一次的元素
DTD属性
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
--属性声明
属性类型:
CDATA 值为字符数据 (character data)
(en1|en2|..) 此值是枚举列表中的一个值
ID 值为唯一的 id
IDREF 值为另外一个元素的 id
IDREFS 值为其他 id 的列表
NMTOKEN 值为合法的 XML 名称
NMTOKENS 值为合法的 XML 名称的列表
ENTITY 值是一个实体
ENTITIES 值是一个实体列表
NOTATION 此值是符号的名称
xml: 值是一个预定义的 XML 值
默认值:
#REQUIRED 属性值是必需的
#IMPLIED 属性不是必需的
#FIXED value 属性值是固定的
stus.dtd
<!ELEMENT stus (stu*)>
<!ELEMENT stu (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ATTLIST stu id CDATA #IMPLIED>
引入DTD
- 引入网络DTD
<!-- 文档类型 根标签名字 网络上的dtd dtd名称 dtd路径 -->
<!DOCTYPE stu PUBLIC "//UNKNOWN/" "unkmown.dtd" >
- 引入本地DTD
<!-- 文档类型 根标签名字 dtd路径 -->
<!DOCTYPE stu SYSTEM "stu.dtd" >
- 直接内嵌DTD
<!DOCTYPE stus [
<!ELEMENT stus (stu*)>
<!ELEMENT stu (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ATTLIST stu id CDATA #IMPLIED>
]>
5.XSD - 元素
一个 schema 声明往往看上去类似这样:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.w3school.com.cn"
xmlns="http://www.w3school.com.cn"
elementFormDefault="qualified">
①xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
显示 schema 中用到的元素和数据类型来自命名空间 “http://www.w3.org/2001/XMLSchema”.同时它还规定了来自命名空间 “http://www.w3.org/2001/XMLSchema” 的元素和数据类型应该使用前缀 xs:
②targetNamespace="http://www.w3school.com.cn"
显示被此 schema 定义的元素 (note, to, from, heading, body) 来自命名空间: “http://www.w3school.com.cn”。
③xmlns="http://www.w3school.com.cn"
指出默认的命名空间是 “http://www.w3school.com.cn”。
④elementFormDefault="qualified"
指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定。
在 XML 文档中引用 Schema:
<note xmlns="http://www.w3school.com.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3school.com.cn note.xsd">
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
①xmlns="http://www.w3school.com.cn"
规定了默认命名空间的声明。此声明会告知 schema 验证器,在此 XML 文档中使用的所有元素都被声明于 “http://www.w3school.com.cn” 这个命名空间。
②有了可用的 XML Schema 实例命名空间:xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
,就可以使用 schemaLocation 属性了。此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的 XML schema 的位置:xsi:schemaLocation="http://www.w3school.com.cn note.xsd"
schema中元素声明
名称空间的作用
一个xml可以引用多个schema约束,但只等阴影一个DTD约束。
名称空间的作用就是在写元素的时候,可以指定该元素使用的是哪一套约束规则。默认情况下,如果只有一套规则,那么可以这么写:
<!-- 单个 -->
<name>张三</name>
<!-- 多个 -->
<aa:name>张三</aa:name>
<bb:name>李四</bb:name>