xml(Extensible Markup language) 可扩展性标记语言,就是开发者在符合xml命名规则的基础上,可以根据自己的需求定义自己的标签;
xml用处主要有以下两个:
1.配置文件,我们在学习框架时,经常使用xml配置文件;
2.用来存储数据,在网络中传输
xml和html的区别:- xml语法严格,html语法松散- xml用来存储数据,html用来展示数据- xml可以自定义标签,html是预定义标签
xml的基本语法:
1.xml的第一行必须定义为文档声明(<?xml version = ‘‘1.0’ ?’>)
2.xml文档中有且仅有一个根标签
3.属性值必须使用引号(单双都可)
4.标签必须正确关闭
5.xml标签区分大小写
xml我们可以自己定义标签,如果不自己定义,就得满足一定的约束;
什么是约束:规定xml的书写规则,规定了你在xml中能够使用哪些标签和哪些属性;
一般约束文档是由开发人员提供好的,我们只需要在xml中引入约束文档
即可;
格式良好的XML文档:遵循XML语法的。
有效的XML文档:遵守约束的XML文档。
注意:有效的XML文档必定是格式良好的,但良好的不一定是有效的
一下是两种常见的约束:
举例:定义了students根标签,可以定义无数个student标签
在student标签中只能定义name,age,sex标签,且按照顺序
a、DTD(Document Type Definition):文档类型定义
作用:约束XML的书写规范
注意:dtd可以写在单独的文件中,扩展名是dtd,且必须使用UTF-8编码进行保存。
b、XML文档中如何导入DTD约束文档(XML外部)
l dtd文档在本地:
l dtd文档在网络上:
c、了解:也可以把DTD的内容直接写在XML文档内部。
写在XML文档内部,dtd没有编码要求。(了解)
DTD的主要缺陷是:不能对标签体中的数据类型进行限定,容易引发错误:
XML Schema 是 DTD 的继任者
我们认为 XML Schema 很快会在大部分网络应用程序中取代 DTD。
理由如下:
XML Schema 可针对未来的需求进行扩展
XML Schema 更完善,功能更强大
XML Schema 基于 XML 编写
XML Schema 支持数据类型
XML Schema 支持命名空间
XML 文档可对 DTD 或 XML Schema 进行引用。
对 DTD 的引用(DTD约束文档后缀名是.dtd
)
此文件包含对 DTD 的引用:
<?xml version="1.0"?><!DOCTYPE note SYSTEM "http://www.w3school.com.cn/dtd/note.dtd"><note><to>George</to><from>John</from><heading>Reminder</heading><body>Don't forget the meeting!</body></note>
对 XML Schema 的引用(Schema约束文档后缀名是.xsd
)
此文件包含对 XML Schema 的引用:
<?xml version="1.0"?><notexmlns="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>
解释:
1.需要我们填写xml文件的根标签<note>
**2.引入xsi前缀(固定写法)
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance
引入xsi前缀后,我们可以通过这个前缀来引入xsd文件;
xsi:schemaLocation="http://www.w3school.com.cn note.xsd
schemaLocation:表示文档路径note.xsd
其中http://www.w3school.com.cn叫作名称空间,它是给文档路径note.xsd起了个名字
有了这个名称空间以后,我们以后要使用note.xsd中的标签我们必须在标签前面加上名称空间,但是为了简便,我们给名称空间加了一个前缀:
xmlns="http://www.w3school.com.cn"
这里默认是空白前缀,如果我们给名称空间起了一个a前缀,那么标签就得这样写了
<?xml version="1.0"?><a:notexmlns:a="http://www.w3school.com.cn"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.w3school.com.cn note.xsd"><a:to>George</a:to><a:from>John</a:from><a:heading>Reminder</a:heading><a:body>Don't forget the meeting!</a:body></a:note>
起前缀的作用是:
如果一个xml文件被多个xsd文档约束,然而这些文档中规定了有相同的标签,这时起前缀,我们再写标签时才知道是哪一个约束文档中的;
再拿springMVC的配置xml配置文件来举例:
这里引入了3个xsd文件,然后为他们分别起了不同的名称空间
beans:使用的空白前缀,因此在写bean标签时不用写前缀;
而context和mvc文档起了相应的context,mvc前缀,因此如果想使用文档中的标签时,得加上相应的前缀
。**
区别:
DOM.DOM4j是一次性将xml文件加载到内存,再解析;
而SAX解析属于事件驱动型,是边读边解析,因此SAX解析适用于解析大的XML文件;
原理分析:
在使用 DOM 解析 XML 文档时,需要读取整个 XML 文档,在内存中构架代表整个 DOM 树的Doucment对象,从而再对XML文档进行操作。此种情况下,如果 XML 文档特别大,就会消耗计算机的大量内存,并且容易导致内存溢出。
SAX解析允许在读取文档的时候,一行一行读取,读取一行释放一行,而不必等到整个文档装载完才会文档进行操作。
SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分:解析器和事件处理器: 解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以指定解析器去解析某个XML文档。 解析器采用SAX方式在解析某个XML文档时,它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器的方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。 事件处理器由程序员编写,程序员通过事件处理器中方法的参数,就可以很轻松地得到sax解析器解析到的数据,从而可以决定如何对数据进行处理
xml常见解析器:
现在用的最多的是DOM4j;使用DOM4j需要导入Dom4j.jar包