一、xml简介
XML(Extensible Markup Language):可扩展性标记语言
什么是可扩展性标记语言呢?
标记性语言:用于(增强)控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。html是标记型语言、使用标签操作。
可扩展性:标签 不是固定的,可以自己定义
html:旨在显示数据。html里的标签都是固定的,每个标签都有特定的含义。
xml:旨在传输数据。可以自定义标签。
二、xml作用
XML可以在保存数据的同时保存数据之间的关系,可以用在不同系统之间传输数据
用作应用程序配置文件使用。
三、xml语法
1.文档声明
用来声明xml的基本属性,用来指挥解析引擎如何去解析当前xml
通常一个xml都要包含并且只能包含一个文档声明
xml的文档必须在整个xml的最前面,在文档声明之前不能有任何内容
<?xml version="1.0" ?>--version是必须存在的属性,表明当前xml所遵循规范的版本
<?xml version="1.0" encoding="utf-8" ?>--encoding用来只会解析引擎在解析xml时使用的编码,一定要保证xml格式的数据在保存时使用的编码和解析时使用的编码必须一致,才不会有乱码问题
<?xml version="1.0" encoding="utf-8" standalone="yes" />--standalone属性用来指明当前xml是否是一个独立的xml,默认值是yes表明当前文档不需要依赖于其他文档,如果当前文档依赖其他文档而存在则需要将此值设置为no
2.元素
一个xml标签就是一个元素, 一个标签分为开始标签和结束标签,在开始标签和结束标签之间可以包含文本内容,这样的文本内容叫做标签体
如果标签的开始标签和结束标签之间不包含标签和子标签则可以将开始标签和结束标签进行合并,这样的标签就叫做自闭标签
一个标签中也可以包含任意多个子标签,但是一定要注意标签一定要合理嵌套
一个格式良好的xml要包含并且只能包含一个根标签,其他的标签都应该是这个标签的子孙标签
一个XML元素可以包含字母、数字以及其它一些可见字符,但必须遵守下面的一些规范:
区分大小写,例如,<P>和<p>是两个不同的标记。
不能以数字或标点符号或"_"开头。
不能以xml(或XML、或Xml 等)开头。
不能包含空格
名称中间不能包含冒号(:)。
3.属性
一个标签可以有多个属性,每个属性都有它自己的名称和取值,例如:
<china capital="beijing"/> 属性的值需要用单引号或双引号括起来
属性的名在定义时要遵循和xml元素相同的命名规则
4. 注释
<!-- 注释内容 -->
注释可以出现在xml文档的任意位置除了整个文档的最前面.不能出现在文档声明之前
注释不能嵌套注释
5.CDATA区/转义字符
<![CDATA[转义的内容]]>:
当XML中一段内容不希望被解析器解析时可以使用CDATA区将其包住
当解析器遇到CDATA区时会将其内容当作文本对待,不会进行解析
语法:<![CDATA[ 内容 ]]>
转义字符:
& --> &
< --> <
> --> >
" --> "
' --> '
6.处理指令
处理指令,简称PI (processing instruction)。处理指令用来指挥解析引擎如何解析XML文档内容。
<?xml-stylesheet type="text/css" href="1.css"?>
四、xml约束
1.什么是XML约束?
在xml技术里,可以编写一个文档来约束一个xml文档的写法,这称之为XML约束
2.为什么要使用xml约束?
我们从网上下载了一个开源框架,这个开源框架是使用XML作为配置文件的,这时候框架的设计者就需要约束我们配置文件的写法。
3.xml约束的作用?
约束xml文档的写法;对xml进行校验
4.常见的xml约束技术?
(1)XML DTD:最早的xml约束,.dtd平面文档
两种引入(定义)方式:
a. 引入外部独立的dtd文件:
<!DOCTYPE 文档根节点 SYSTEM "dtd文件路径"> 此时standalone=”no”
文件清单:book.dtd
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
b. 定义在xml文件内部:此时文档声明中的standalone=”yes”
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 书架 [
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
]>
<书架>
<书>
<书名>明天,你好</书名>
<作者>小霍霍</作者>
<售价>39.00元</售价>
</书>
...
</书架>
注意:.dtd文件应使用UTF-8或Unicode编码
名称空间的概念:全世界独一无二的名字,用来唯一标识某个资源
(2)XML Schema:新的xml文档约束,用来替代dtd。
为了克服DTD的局限性,对名称空间支持非常好,支持更多的数据类型,包括用户自定义的。比DTD复杂,约束能力强大,正在逐步取代DTD。
在XML Schema中,每个约束模式文档都可以被赋以一个唯一的名称空间,名称空间用一个唯一的URI(Uniform Resource Identifier,统一资源标识符)表示。 在Xml文件中书写标签时,可以通过名称空间声明(xmlns),来声明当前编写的标签来自哪个Schema约束文档。如:
<书架 xmlns="http://www.itcast.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=“http://www.itcast.cn book.xsd">
<书>
<书名>明天,你好</书名>
<作者>小霍霍</作者>
<售价>48.00元</售价>
</书>
<书架>
5.dtd语法
(1)元素
<!ELEMENT 元素名称 元素约束>
元素约束:
存放类型:ANY/EMPTY
元素约束:子元素的列表,将可以包含的子元素用小括号括起来
子元素之间可以使用逗号进行分割,表明子元素必须按照顺序出现
子元素之间可以使用竖线进行分割,表面子元素出现其中之一
#PCDATA 表明包含标签体
+ 表示一次或多次
* 0次或多次
? 0次或一次
(2)属性
<!ATTLIST 元素名
属性名 属性类型 属性约束
属性名2 属性类型 属性约束
......
>
属性类型:
CDATA:表示属性的值是一个普通字符串
ENUMERATED : 属性的值是一个枚举列表中的值
ID: 表明属性的值必须在整个文档中都是唯一的,如果有重复的id则校验不通过,ID 属性的值只能由字母,下划线开始,不能使用数字,不能出现空白字符
属性约束:
#REQUIRED --- 表明当前属性是一个必须存在的属性,如果这样的属性不存在则在校验时会报错
#IMPLIED --- 表明当前属性是一个可选的属性,可以有也可以没有
#FIXED '固定值' --- 表明当前属性具有一个固定值,这样的属性不需要进行赋值,自动就会取这个固定值为值.如果这样的属性指定了一个不是固定值的值则校验报错
'默认值' --- 表明当前属性具有一个默认值,如果给了其他的值就用其他值,如果没有给值则取这个默认值
(3)ENTITY(实体)
<!ENTITY >,就是对一大段内容的引用,可以简化代码的复用
引用实体:在xml中引用的实体叫做引用实体
<!ENTITY 实体名称 “实体内容” >
&实体名称;
参数实体:在dtd中引用的实体叫做参数实体
<!ENTITY % 实体名称 "实体内容">
%实体名称;
2.XML两种解析方式:
(1)Dom解析:将整个XML使用类似树的结构保存在内存中,再对其进行操作
需要等到XML完全加载进内存才可以进行操作
耗费内存,当解析超大的XML时慎用。
可以方便的对xml进行增删改查操作
(2)Sax解析:逐行扫描XML文档,当遇到标签时触发解析处理器,采用事件处理的方式解析xml
在读取文档的同时即可对xml进行处理,不必等到文档加载结束,相对快捷不需要加载进内存
因此不存在占用内存的问题,可以解析超大XML
只能用来读取XML中数据,无法进行增删改
3.基于这两种解析思想市面上就有了很多的解析api
sun jaxp既有dom方式也有sax方式,并且这套解析api已经加入到j2se的规范中,意味这不需要导入任何第三方开发包就可以直接使用这种解析方式.但是这种解析方式效率低下,没什么人用.
dom4j 可以使用dom方式高效的解析xml.
!!dom4j
导入开发包,通常只需要导入核心包就可以了,如果在使用的过程中提示少什么包到lib目录下在导入缺少的包即可
4.DOM-----Jaxp(sun,j2se)
获取Transformer工厂:TransformerFactory transformerFactory = TransformerFactory.newInstance();
获取Transfomer对象:Transformer transformer = transformerFactory.newTransformer();
创建代表输入的Sourcet对象:Source source = new DOMSource(doc);
创建代表输出的Result对象:Result result = new StreamResult(new FIle("book.xml"));
使用Transformer将XMLSource转换为Result:transformer.transform(source , Result);
5.SAX---dom4j(dom4j):利用 SAX解析XML文档,涉及两个部分:解析器和事件处理器。
使用SAXParserFactory创建SAX解析工厂:SAXParserFactory spf = SAXParserFactory.newInstance();
通过SAX解析工厂得到解析器对象: SAXParser sp = spf.newSAXParser();
通过解析器对象得到一个XML的读取器:XMLReader xmlReader = sp.getXMLReader();
设置读取器的事件处理器:xmlReader.setContentHandler(new MyContentHandler());
6.解析xml文件:xmlReader.parse("book.xml");
DOM4j解析xml文件:
创建解析器:SAXReader reader=new SAXReader();
利用解析器读入xml文档:Document document=reader.read(new File(“input.xml”));
获取文档的根节点:Element root=document.getRootElement();
获取某个节点的子节点:Element element=ele.element(“书名”);
获取节点名字:node.getName();
设置节点的名字:node.setName(String newName)
获取节点的文字(标签体):String text=node.getText();设置:node.setText(“中国”)
添加子节点:ele.add(Element e);ele.addElement(“北京”)
删除子节点:parentElm.remove(childElm);
获取父节点:node.getParent();
获取某节点对象的某属性:Attribute attr=ele.attribute(“中国”)
在指定位置插入节点:得到插入位置的节点列表(list):List list=root.element(“书”).elements();
调用list.add(1,aaa);
获取属性的名、值:String name=attribute.getName();
XML(Extensible Markup Language):可扩展性标记语言
什么是可扩展性标记语言呢?
标记性语言:用于(增强)控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。html是标记型语言、使用标签操作。
可扩展性:标签 不是固定的,可以自己定义
html:旨在显示数据。html里的标签都是固定的,每个标签都有特定的含义。
xml:旨在传输数据。可以自定义标签。
二、xml作用
XML可以在保存数据的同时保存数据之间的关系,可以用在不同系统之间传输数据
用作应用程序配置文件使用。
三、xml语法
1.文档声明
用来声明xml的基本属性,用来指挥解析引擎如何去解析当前xml
通常一个xml都要包含并且只能包含一个文档声明
xml的文档必须在整个xml的最前面,在文档声明之前不能有任何内容
<?xml version="1.0" ?>--version是必须存在的属性,表明当前xml所遵循规范的版本
<?xml version="1.0" encoding="utf-8" ?>--encoding用来只会解析引擎在解析xml时使用的编码,一定要保证xml格式的数据在保存时使用的编码和解析时使用的编码必须一致,才不会有乱码问题
<?xml version="1.0" encoding="utf-8" standalone="yes" />--standalone属性用来指明当前xml是否是一个独立的xml,默认值是yes表明当前文档不需要依赖于其他文档,如果当前文档依赖其他文档而存在则需要将此值设置为no
2.元素
一个xml标签就是一个元素, 一个标签分为开始标签和结束标签,在开始标签和结束标签之间可以包含文本内容,这样的文本内容叫做标签体
如果标签的开始标签和结束标签之间不包含标签和子标签则可以将开始标签和结束标签进行合并,这样的标签就叫做自闭标签
一个标签中也可以包含任意多个子标签,但是一定要注意标签一定要合理嵌套
一个格式良好的xml要包含并且只能包含一个根标签,其他的标签都应该是这个标签的子孙标签
一个XML元素可以包含字母、数字以及其它一些可见字符,但必须遵守下面的一些规范:
区分大小写,例如,<P>和<p>是两个不同的标记。
不能以数字或标点符号或"_"开头。
不能以xml(或XML、或Xml 等)开头。
不能包含空格
名称中间不能包含冒号(:)。
3.属性
一个标签可以有多个属性,每个属性都有它自己的名称和取值,例如:
<china capital="beijing"/> 属性的值需要用单引号或双引号括起来
属性的名在定义时要遵循和xml元素相同的命名规则
4. 注释
<!-- 注释内容 -->
注释可以出现在xml文档的任意位置除了整个文档的最前面.不能出现在文档声明之前
注释不能嵌套注释
5.CDATA区/转义字符
<![CDATA[转义的内容]]>:
当XML中一段内容不希望被解析器解析时可以使用CDATA区将其包住
当解析器遇到CDATA区时会将其内容当作文本对待,不会进行解析
语法:<![CDATA[ 内容 ]]>
转义字符:
& --> &
< --> <
> --> >
" --> "
' --> '
6.处理指令
处理指令,简称PI (processing instruction)。处理指令用来指挥解析引擎如何解析XML文档内容。
<?xml-stylesheet type="text/css" href="1.css"?>
四、xml约束
1.什么是XML约束?
在xml技术里,可以编写一个文档来约束一个xml文档的写法,这称之为XML约束
2.为什么要使用xml约束?
我们从网上下载了一个开源框架,这个开源框架是使用XML作为配置文件的,这时候框架的设计者就需要约束我们配置文件的写法。
3.xml约束的作用?
约束xml文档的写法;对xml进行校验
4.常见的xml约束技术?
(1)XML DTD:最早的xml约束,.dtd平面文档
两种引入(定义)方式:
a. 引入外部独立的dtd文件:
<!DOCTYPE 文档根节点 SYSTEM "dtd文件路径"> 此时standalone=”no”
文件清单:book.dtd
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
b. 定义在xml文件内部:此时文档声明中的standalone=”yes”
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 书架 [
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
]>
<书架>
<书>
<书名>明天,你好</书名>
<作者>小霍霍</作者>
<售价>39.00元</售价>
</书>
...
</书架>
注意:.dtd文件应使用UTF-8或Unicode编码
名称空间的概念:全世界独一无二的名字,用来唯一标识某个资源
(2)XML Schema:新的xml文档约束,用来替代dtd。
为了克服DTD的局限性,对名称空间支持非常好,支持更多的数据类型,包括用户自定义的。比DTD复杂,约束能力强大,正在逐步取代DTD。
在XML Schema中,每个约束模式文档都可以被赋以一个唯一的名称空间,名称空间用一个唯一的URI(Uniform Resource Identifier,统一资源标识符)表示。 在Xml文件中书写标签时,可以通过名称空间声明(xmlns),来声明当前编写的标签来自哪个Schema约束文档。如:
<书架 xmlns="http://www.itcast.cn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=“http://www.itcast.cn book.xsd">
<书>
<书名>明天,你好</书名>
<作者>小霍霍</作者>
<售价>48.00元</售价>
</书>
<书架>
5.dtd语法
(1)元素
<!ELEMENT 元素名称 元素约束>
元素约束:
存放类型:ANY/EMPTY
元素约束:子元素的列表,将可以包含的子元素用小括号括起来
子元素之间可以使用逗号进行分割,表明子元素必须按照顺序出现
子元素之间可以使用竖线进行分割,表面子元素出现其中之一
#PCDATA 表明包含标签体
+ 表示一次或多次
* 0次或多次
? 0次或一次
(2)属性
<!ATTLIST 元素名
属性名 属性类型 属性约束
属性名2 属性类型 属性约束
......
>
属性类型:
CDATA:表示属性的值是一个普通字符串
ENUMERATED : 属性的值是一个枚举列表中的值
ID: 表明属性的值必须在整个文档中都是唯一的,如果有重复的id则校验不通过,ID 属性的值只能由字母,下划线开始,不能使用数字,不能出现空白字符
属性约束:
#REQUIRED --- 表明当前属性是一个必须存在的属性,如果这样的属性不存在则在校验时会报错
#IMPLIED --- 表明当前属性是一个可选的属性,可以有也可以没有
#FIXED '固定值' --- 表明当前属性具有一个固定值,这样的属性不需要进行赋值,自动就会取这个固定值为值.如果这样的属性指定了一个不是固定值的值则校验报错
'默认值' --- 表明当前属性具有一个默认值,如果给了其他的值就用其他值,如果没有给值则取这个默认值
(3)ENTITY(实体)
<!ENTITY >,就是对一大段内容的引用,可以简化代码的复用
引用实体:在xml中引用的实体叫做引用实体
<!ENTITY 实体名称 “实体内容” >
&实体名称;
参数实体:在dtd中引用的实体叫做参数实体
<!ENTITY % 实体名称 "实体内容">
%实体名称;
五、XML编程:
利用java程序去增删改查(CRUD)xml中的数据
1.XML编程:Create、Read、Update、Delete2.XML两种解析方式:
(1)Dom解析:将整个XML使用类似树的结构保存在内存中,再对其进行操作
需要等到XML完全加载进内存才可以进行操作
耗费内存,当解析超大的XML时慎用。
可以方便的对xml进行增删改查操作
(2)Sax解析:逐行扫描XML文档,当遇到标签时触发解析处理器,采用事件处理的方式解析xml
在读取文档的同时即可对xml进行处理,不必等到文档加载结束,相对快捷不需要加载进内存
因此不存在占用内存的问题,可以解析超大XML
只能用来读取XML中数据,无法进行增删改
3.基于这两种解析思想市面上就有了很多的解析api
sun jaxp既有dom方式也有sax方式,并且这套解析api已经加入到j2se的规范中,意味这不需要导入任何第三方开发包就可以直接使用这种解析方式.但是这种解析方式效率低下,没什么人用.
dom4j 可以使用dom方式高效的解析xml.
!!dom4j
导入开发包,通常只需要导入核心包就可以了,如果在使用的过程中提示少什么包到lib目录下在导入缺少的包即可
4.DOM-----Jaxp(sun,j2se)
获取Transformer工厂:TransformerFactory transformerFactory = TransformerFactory.newInstance();
获取Transfomer对象:Transformer transformer = transformerFactory.newTransformer();
创建代表输入的Sourcet对象:Source source = new DOMSource(doc);
创建代表输出的Result对象:Result result = new StreamResult(new FIle("book.xml"));
使用Transformer将XMLSource转换为Result:transformer.transform(source , Result);
5.SAX---dom4j(dom4j):利用 SAX解析XML文档,涉及两个部分:解析器和事件处理器。
使用SAXParserFactory创建SAX解析工厂:SAXParserFactory spf = SAXParserFactory.newInstance();
通过SAX解析工厂得到解析器对象: SAXParser sp = spf.newSAXParser();
通过解析器对象得到一个XML的读取器:XMLReader xmlReader = sp.getXMLReader();
设置读取器的事件处理器:xmlReader.setContentHandler(new MyContentHandler());
6.解析xml文件:xmlReader.parse("book.xml");
DOM4j解析xml文件:
创建解析器:SAXReader reader=new SAXReader();
利用解析器读入xml文档:Document document=reader.read(new File(“input.xml”));
获取文档的根节点:Element root=document.getRootElement();
获取某个节点的子节点:Element element=ele.element(“书名”);
获取节点名字:node.getName();
设置节点的名字:node.setName(String newName)
获取节点的文字(标签体):String text=node.getText();设置:node.setText(“中国”)
添加子节点:ele.add(Element e);ele.addElement(“北京”)
删除子节点:parentElm.remove(childElm);
获取父节点:node.getParent();
获取某节点对象的某属性:Attribute attr=ele.attribute(“中国”)
在指定位置插入节点:得到插入位置的节点列表(list):List list=root.element(“书”).elements();
调用list.add(1,aaa);
获取属性的名、值:String name=attribute.getName();