XML.docx
《XML.docx》由会员分享,可在线阅读,更多相关《XML.docx(20页珍藏版)》请在冰豆网上搜索。
![XML.docx](https://file1.bdocx.com/fileroot1/2023-2/11/0e4af217-c29b-441b-887e-d27079333769/0e4af217-c29b-441b-887e-d270793337691.gif)
XML
一、XML的背景
XML第一天
2007年5月25日
1)XML代表扩展的标记语言(eXtensibleMarkupLanguage);
2)XML由W3C联盟发展维护;
3)XML是一种元语言,可以用来定义其它标签语言;
4)XML没有定义任何标记,它提供了一种工具定义标记以及它们之间的结构关系;
5)XML是一种用于结构化文本交换的标记语言;
6)XML代表了内容的结构也代表了内容本身;
7)XML继承自SGML(标准标记语言)。
SGML的前身GML由IBM在1960年发明,用于
描述设备无关的文本
8)XML是SGML的子语言,由SGML简化而来,起初的目的是为Web的结构文档提供服
务。
9)W3C组织在1998年2月10日发布XML1.0版,第二个版本发布于2000年10月9日。
10)XML是分层的树形结构的自解释的一种可扩展的标记语言。
<姓名>liucy姓名>
|
|
|
开始标记|结束标记
描述的数据
在标记语言中,标记是可以嵌套的
XML和HTML的关系
1)事实上,HTML和XML不能够进行比较的。
因为XML是一种元语言,而HTML是一
种定义好的标记语言。
XML是描述数据的语言,HTML是描是数据外观的语言。
2)HTML有一套确定的标记。
在W3C标准规范中定义了HTML标记的含义并由部分浏览
器实现了。
3)HTML标记非常适合描述人类易读的可视化文本。
4)HTML定义了许多表现指令用以优化在浏览器中的显示。
5)在HTML标记中,数据固有的结构丢失了。
6)HTML没有维持数据类型信息的完整性、约束、或实体间的其它关系,而XML提供了
这些特征。
xmlverson="1.0"encoding="GBK"?
>--声明这是一个xml文件,默认编码方式UTF-8
--跟标记,最外层只能有一个跟标记,即只能有一个树根
Liucy
30
Huxz
20
对XML文件的要求,格式良好(符合XML的语法要求),有效的XML;
XML的用途,数据传输的中间件,做为通用文档格式
1,数据交换
2,web服务
3,内容管理
4,web集成
5,充当配置文件
格式良好的XML文件的规范
XML文档是一种严格规范的语言,必须按照规范来写。
XML文档的框架结构
XML文档=序言+元素+杂项(可选)
1)序言
序言=(XML声明)+(杂项)+(文档类型声明)
XML声明
xml版本信息(编码信息)(文档独立性信息)?
>
如:
xmlversion="1.0"encoding="gb2312"standalone="yes"?
>
文档类型声明:
规定元素的结构和属性列表的取值
如:
DOCTYPEstudinfoSYSTEM"studinfo.dtd">
2)元素
空元素<空元素标签名属性="属性值"/>
非空元素<起始标签>内容<结束标签>
内容=(子元素|字符数据|字符数据段|引用|处理指令|注释)*
字符数据
字符数据中,不能含有&,<,>,',",需要采用实体引用的方式
3)杂项
字符数据段
[CDATA[字符数据]]>
引用
ENTITY引用名".......">
处理指令XML为其它应用程序准备的接口。
处理指令?
>
注释
--注释内容-->
空白符指空格、回车等
XML文件事例
xmlverson="1.0"?
>
--这一句一定要求写在文件的第一行-->
--只能有一个根元素即那一对根标签-->
--根标签-->
--根元素的内容-->
--子元素-->
...
XML文件的写法
xml文档是有标签和标签中的内容组成的,标签和标签中的内容合成为元素
标签名可以由字母、数字、"_"、".",只可以以字母,下划线开头
非空元素
(起始标签)
aaa(内容)
(结束标签)
空元素
格式良好的XML文档的规范
1)文档声明位于文件的开头
xmlverson="1.0"?
>
2)文档中只能定义一个唯一的根元素(根元素是在文档声明之后的最外层的元素)
3)标签必须闭合,且不能交叉,有元素的起始标签,就必须有其结束标签(空元素除外)
4)层层嵌套,每一对标签总是出于另一对标签的内或和其处于同一层,不能交叉(根元素
chuw)
5)大小写敏感,起始标签和结束标签的名字要一致
6)属性值必须用引号引起来
7)注意特殊字符,使用时需要使用转义字符。
注意:
1.第一行一定要写
xmlverson="1.0"?
>
2.xml文件是由元素和元素的内容以及属性组成的,一个xml文件中只能有一个根元素,标
签和标签的内容加在一起叫作一个元素。
xml是大小写敏感的,只能以字母或下划线开头。
字符转义
<代表"<",
>代表">",
"代表双引号,
&代表"&",
'代表单引号
字符数据段,不解析
[CDATA[........]]>
最内层[]中的部分不必使用转义,其中内容会直接输出。
练习:
写一个xml文件,内容是自己的简历
要求:
必须要写明年龄,英语水平
&2.DTD(结构定义)
DTD文档是用于规定XML文档的结构。
只有结构符合所引用的DTD文件的XML文件才
能称之为有效的XML文件。
DTD(文档类型定义)
!
DOCTYPE定义DTD文件名
!
ELEMENT定义元素中可用的数据类型
#PCDATA可解析字符串。
1)DTD的调用
方式一:
调用内部文档类型定义。
xmlversion="1.0"standalone="yes"?
>
DOCTYPEstudinfo[
ELEMENTstudinfo(#PCDATA)>]>
注意点:
(1)studinfo与(#PCDATA)有空格
(2)文档类型名与根元素名必须一致
方式二:
调用外部文档类型定义,需要写一个DTD文档
xmlversion="1.0"standalone="no"?
>
DOCTYPEstudinfoSYSTEM"studinfo1.dtd">
注意点:
(1)standalone="no"
(2)注意dtd文件的路径
2)DTD的结构
是否有DTD文件
如果文档是一个"有效的XML文档"(见上一章),那么文档一定要有相应DTD文件,并且严
格遵守DTD文件制定的规范。
DTD文件的声明语句紧跟在XML声明语句后面,格式如下:
DOCTYPEtype-of-docSYSTEM/PUBLIC"dtd-name">
其中:
"!
DOCTYPE"是指你要定义一个DOCTYPE;
"type-of-doc"是文档类型的名称,由你自己定义,通常于DTD文件名相同;
"SYSTEM/PUBLIC"这两个参数只用其一。
SYSTEM是指文档使用的私有DTD文件的网址,
而PUBLIC则指文档调用一个公用的DTD文件的网址。
PUBLIC后面跟正式公用标识符和dtd的URL
"dtd-name"就是DTD文件的网址和名称。
所有DTD文件的后缀名为".dtd"。
我们还是用上面的例子,应该写成这样:
xmlversion="1.0"standalone="no"encode="UTF-8"?
>
DOCTYPEfilelistSYSTEM"filelist.dtd">
dtd文件中
定义语法:
ELEMENTRoot(#PCDATA)>根标记,只能是文本,并且不能有子标记
ELEMENTRoot(A)>Root标记下有一个A的子标记,不能有文本内容
ELEMENTRoot(A+)>Root标记下有一个或多个A的子标记,没有这个子标记不行,不
能有文本内容
ELEMENTRoot(A*)>Root标记下有0~n个A的子标记,不能有文本内容
ELEMENTRoot(A?
)>Root标记下有一个或零个A的子标记,不能有文本内容
ELEMENTRoot(A,B)>Root标记下有一个A的子标记和一个B字标记,要先有A,后
有B
ELEMENTRoot(A|B)>Root标记下有一个A的子标记或者一个B字标记
ELEMENTRoot>Root标记必须是空的,换行也不行
定义属性的约束
ATTLISTelementName
attributeNameattributeTypeattributeDefault>
ATTLISTA
p1CDATA
p2{a|b|c}
p3ID
>
属性名
CDATA属性是文本内容
{enumerated}写一个枚举,把枚举值列出来
NMTOKEN文本内容中的自负取值与标记命名规则一样,内容只能是字母,数字,下划线,
连字符
NMTOKENS复数情况,用空格分隔
ID是属性的类型,属性值必须唯一
IDREF表示属性的取值必须是文档范围中已经存在的ID属性的值,必须引用某个ID属性
的值
IDREFS复数情况,用空格分隔
属性默认形式
#REQUIRED该属性必须有,但是没有默认值
#IMPLIED属性可有可没有,也没有默认值
attribute-value用“”引起来
#FIXED用#FIXED“”形式,并且是固定值,属性的值必须是引号中的内容
实体声明
实体:
存储了任意符合规则的xml文档单元片断。
1、内部通用实体
定义格式
ENTITY实体名“实体内容”>
引用格式&实体名;
2、外部通用实体
定义格式
ENTITY实体名SYSTEM“外部实体的URI”>
引用格式&实体名;
事例:
xmlversion="1.0"standalone="no"?
>
DOCTYPEstudinfo[
ELEMENTstudinfo(name,age,address,school)>
ELEMENTname(#PCDATA)>
ELEMENTage(#PCDATA)>
ELEMENTaddress(#PCDATA)>
ELEMENTschool(#PCDATA)>
ENTITYschoolinfoSYSTEM"schoolinfo.txt">
]>
zhangshan
20
beijinghaidian&schoolinfo;
XML第二天
一、NameSpace(命名空间)
2007年5月28日
namespace是为了解决XML文档中的命名冲突问题的。
DTD不支持命名空间,解析器无法测试命名空间。
1、作用:
解决XML文档中命名冲突的问题,即将
XML文档与引用URI标识的名域相结合,来
限定其中的元素和属性名。
示例:
xmlversion="1.0"encoding="UTF-8"standalone="yes"?
>
t1
man
s1
--这个name和teacher根元素中的name发生命名冲突-->
girl
--这个sex和teacher根元素中的sex发生命名冲突-->
2、名域的声明
(1)直接定义
xmlns:
名域前缀="名域的URI"(唯一性)
类比:
名字与身份证
名域的使用,名域前缀:
需要限定的元素名
示例:
xmlversion="1.0"encoding="UTF-8"standalone="yes"?
>
teacherxmlns:
teacher="
xmlns:
student="
name>zhangshan
name>
sex>man
sex>
student>
name>stu1
name>
sex>girl
sex>
student>
teacher>
(2)缺省定义
xmlns=名域的URI
--在文档的默认名称空间中
xmlversion="1.0"encoding="UTF-8"standalone="yes"?
>
xmlns:
student="
zhangshan
man
name>stu1
name>
sex>girl
sex>
3、名域的使用
(1)用名域限定元素
xmlversion="1.0"encoding="UTF-8"standalone="yes"?
>
teacherxmlns:
teacher="
xmlns:
student="
name>zhangshan
name>
sex>man
sex>
student>
name>stu1
name>
sex>girl
sex>
student>
teacher>
(2)用名域限定属性
xmlversion="1.0"encoding="UTF-8"standalone="yes"?
>
teacherxmlns:
teacher="
xmlns:
student="
name>zhangshan
name>
sex>man
sex>
addressteacher:
city="beijing">caoyang,no1
address>
student>
name>stu1
name>
sex>girl
sex>
addressstudent:
city="tianjin">haidian,no2
address>
student>
teacher>
4、名域的作用范围
名域能够把声明它的元素和该元素的所有子元素关联起来,除非它们被其他的名域声明所覆
盖。
局部优先
两个标志是否属于同一个命名空间是由URI决定的,跟前缀没有关系
若定义了一个无前缀的命名空间,那么那些无前缀的标签就属于这个命名空间了
二、XML文档的解析
DOM(文档对象模型)DocumentObjectModle
SAX(SampleAPIforXML)
都是w3c定义的标准
默认使用Apache提供的Xerces实现
采用树状分析,进行建模
1、Dom
为XML文档的已解析版本定义了一组接口。
解析器读入整个文档,然后构建一个驻留内
存的树结构,然后代码就可以使用DOM接口来操作这个树结构。
优点:
整个文档树在内存中,便于操作;支持删除、修改、重新排列等多种功能;
缺点:
将整个文档调入内存(包括无用的节点),浪费时间和空间;
使用场合:
一旦解析了文档还需多次访问这些数据;硬件资源充足(内存、CPU)
DOM解析是将整个的XML文档元素结构读入内存,由根元素向下形成子元素分级树状关
系。
DOM的解析
DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();
方法模式
DocumentBuilderbuilder=factory.newDocumentBuilder();
Documentdocument=builder.parse(name);
---运用的工厂
以上三行代码,使用来生成Document对象的,Document对象就代表了读入内存后结构化
的XML文档。
使用Document对象的getDocumentElement()方法获得子节点,可以通过不断的迭代便利所
有节点,这些节点就代表了元素,从根元素开始一直到最内层的子元素。
getElementsByTagName(Stringtagname)这个方法可以通过元素的名来或得该元素内层元
素,
也就是或得了这个节点的所有子节点(NodeList)NodeList的方法getLength()(列表中的节
点数),
通过循环使用Nodeitem(intindex)(返回集合中的第index个项)方法,来获得每个子节
点。
String.trim();去处空格,制表符,换行标记
DOM解析的其他方法请参阅JAVAAPI文档。
(org.w3c.dom
2、SAX
javax.xml.parsers)
SAX:
事件机制驱动。
在遇到相应的节点时,会发出一个事件,当解析器发现元素开始、元
素结束、文本、文档的开始或结束等时,发送事件,程序员编写响应这些事件的代码,保存
数据。
优点:
不用事先调入整个文档,占用资源少;
SAX解析器代码比DOM解析器代码小,适于Applet,下载
缺点:
不是持久的;事件过后,若没保存数据,那么数据就丢了,比较消耗时间;
只能顺序处理,不能选择读取。
不支持文档的创建和修改。
无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;
使用场合:
Applet;只需XML文档的少量内容,很少回头访问;机器内存少
SAX处理流程
xmlversion="1.0"?
>
UNIX
color
分析这个代码片断的SAX处理器一般情况下将产生以下事件:
Startdocument
Startelement(samples)
Characters(whitespace)
Startelement(server)
Characters(UNIX)
Endelement(server)
Characters(whitespace)
Startelement(monitor)
Characters(color)
Endelement(monitor)
Characters(whitespace)
Endelement(samples)
SAXAPI允许开发人员捕捉这些事件并对它们作出反应。
SAX处理涉及以下步骤:
创建一个事件处理程序。
创建SAX解析器。
向解析器分配事件处理程序。
解析文档,同时向事件处理程序发送每个事件。
要实现SAX解析XML文档,有两种方法,
XMLReader和XMLReaderFactory
XMLReaderread=XMLReaderFactory.createXMLReader();
生成XMLReader对象,使用XMLReader对象的方法parse(Filef,ContentHandlerhandler),
ContentHandler是一个定义好事件处理方法的接口,
DTDHandler,EntityResolver,ErrorHandler这三个接口和ContentHandler接口相同,
但是其中定义的是其他事件处理方法,一般只是实现ContentHandler接口。
使用SAX解析XML文档,需要先有SAXParserFactory对象,他的对象是通过自身的静态
方法newInstance(),
然后再通过SAXParserFactory对象来创建SAXParser对象,使用SAXParser对象的
parse(Filef,DefaultHandlerhandler),DefaultHandler是用来处理解析时发出的事件的类,就可
以进行解析。
DefaultHandler实现了ContentHandler,DTDHandler,EntityResolver,ErrorHandler,四个
接口,但是只给出了空实现,便于使用者覆盖相应的方法。
SAX解析的其他方法请参阅
org.xml.sax.helpers)
JAVAAPI文档。
(javax.xml.p