xml——eXtendsible markup language可扩展的标记语言
作用:
1、可以用来保存数据
2、可以用来配置文件
3、数据传输载体
文档结构:倒树状图结构
<?xml version="1.0" encoding="UTF-8"?>
<stu>
<name>zhangsan</name>
<age>19</age>
</stu>
文档声明He :<?xml version="1.0" encoding="UTF-8" standalon="no"?>
version解析这个xml的时候,使用什么版本的解析器解析
encoding解析xml中的文字的时候,使用什么编码来翻译,保存的xml的时候编码格式要和这个属性一样,否则会出错
standalon写no的时候代表有依赖关联其他的文档,yes为没有,独立的,毕竟少用
元素定义:
1、其实就是里面的标签,<>尖括号括起来的都叫元素,承兑出现
2、文档声明下来的第一个元素叫做根标签
3、标签里面可以嵌套标签
4、空标签<age id="123"/>即是开始,也是结束,一般配合属性使用
5、不能以数字、标点符号开始,也不能含有xml和空格
简单元素:里面只包含文本
复制元素:元素里面还包含其他元素
注释:<!-- 注释内容 -->不能写在第一行
CDATA区:不要解析里面的内容,
<![CDATA[字符]]>,可以将非法字体不转义,或者说不解析
非法字符:严格的讲,在xml中仅含有字符"<"和"&"是非法的,省略号、引号和大于号是合法的,但是把它们替换为实体引用是个好的习惯
< < > > & & . ' " "
xml解析:获取元素里面的字符数据或者属性数据,常用DOM解析和SAX解析
针对以上两种解析方式,有:
jaxp,sun公司,比较繁琐
dom4j,使用比较广泛
dom4j:
1、创建sax读取对象
SAXReader reader = new SAXReader();
2、指定解析的xml源
Document document = reader.read(new File("路径,通常以项目根目录开始"));
3、得到标签
Element rootElement = document.getRootElement();——获取根标签
rootElement.getName();——获取该标签的名字
Element element = rootElement.element("子标签")——获取子标签对象
String str = element.getStringValue();——获取文本里面的内容
String str2 = element.getText();——获取文本里面的内容
List<Element> elements = rootElement.elements("子标签");——获取根标签下的所有子标签
dom4j里面支持Xpath的写法,xpath其实是xml的路径语言,支持我们在解析xml的时候,能够快速的定位倒具体的某一个标签,element需要是根标签
List<Element> element = (Element)element.seletcSingleNodes("xpath路径");——获取单个
List<Element> elements = element.seletcNodes("xpath路径");——获取多个
xml文档约束:
DTD:语法自成一派,早期出现,可读性比较差
新建dtd文件,通常名字与要约束的xml文件同名,基本的约束如下,约束为以下规则
<!ELEMENT 元素的名称 元素的类型>——一定要有空格间隔,否则约束不起作用
<!ELEMENT stus (stu)>——复杂元素就这样写,stus下面只有一个元素stu,但是只能有一个
<!ELEMENT stus (stu)+>——加号代表有一个或者多个,*星号代表零个或者多个,?问号代表零个或者一个
<!ELEMENT stu (name,age)>逗号代表有顺序
<!ELEMENT stu (name|age)>|分割线是只能允许有其中一个
<!ELEMENT name (#PCDATA)>——简单元素就使用(#PCDATA)
<!ELEMENT age (#PCDATA)>——parser charcter data被解析的文本数据
<!ATTLIST 元素名称 属性名称 属性类型 默认值>——属性的约束
默认值如果写了字符串就默认是该字符串,还可以是以下3个:
#REQUIRED——属性值是必须的
#IMPLIED——属性不是必须的
#TEXD value——属性是固定的
<!ATTLIST stu id CDATA #IMPLIED>——约束stu的标签可以有id的属性,普通的文字数据
<!ATTLIST stu id ID #IMPLIED>——属性的值唯一约束
在需要被约束的xml文件里面加入下面句子
走网络上的:<!DOCTYPE stus PUBLIC "//UNKNOW" unknow.dtd>
文件类型 根标签名字 网络上的dtd dtd的名称 dtd的路径
走本地的:<!DOCTYPE stus SYSTEM "stus.dtd">
引入本地的dtd dtd位置
内嵌dtd:<!DOCTYPE[
<!ELEMENT 元素的名称 元素的类型>
]>
Schema:其实就是一个xml,使用xml的语法规则,xml解析器比较方便,为了替代DTD,但是Schema约束文本内容比DTD的内容要多,所以目前也没有真正意义上的替代DTD
文件后缀名是.xsd
<schema xmlns="http://www.w3.org/2001/XMLSchema" ——名称空间,
targetNamespace="http://www.example.org/teacher" ——目标名称空间,下面定义的那些元素都与这个名称空间绑定上
xmlns:tns="http://www.example.org/teacher"
elementFormDefault="qualified" >
<element name="teachers"> <complexType> <sequence >
<!--复杂元素--> <element name="teacher" maxOccurs="unbounded"> <complexType> <sequence>
<!--简单元素--> <element name="name" type="string"></element> <element name="age" type="int"></element> </sequence> </complexType> </element> </sequence> </complexType> </element>
</schema>
maxOccurs="unbounded"——代表该标签可以有多个
引入,在跟标签里面写
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"——必须是这样写这个
xmlns="http://www.example.org/teacher"——写xsd的targetNamespace名称空间,可以随意修改名称空间的内容,只要两边对应即可
xsi:schemaLocation="http://www.example.org/teacher teacher.xsd"——有两端,前半段是名称空间,也是目前空间的值,后半段是约束文件的路径,这里的例子是同一个目录下,所以只写名字
名称空间的作用
一个xml如果想指定它的约束规则,假设使用的DTD,那么这个xml只能指定一个DTD,不能指定多个,但是如果一个xml的约束是定义在schema里面,并且是多个schema,那么是可以的,简单来说:一个xml可以引用多个schema约束,但是只能引用一个DTD约束。
xmlns:aa="http://www.example.org/teacher"
xmlns:bb="http://www.example.org/teacher"
<aa:name>可以这样指定单独一个标签跟随特定的约束