XML

来源:互联网 发布:孤岛危机31.3优化补丁 编辑:程序博客网 时间:2024/04/29 13:32
xml  Extensible  Markup Language


1  "think in java" 59

w3cschool
一、基本语法
二、DTD
三、SAX
四、DOM   dom4j

一  XML简单的历史介绍

1969年 GML   通用标记语言
用于计算机之间的通信,通信就会传输数据,那么就需要一种数据的规范
1985年 SGML  标准通用标记语言
对GML进行完善
1993年 HTML  超文本的标记语言(HyperText Markup Language)
随着万维网的推广,在SGML的基础上,又出现了HTML语言,用于万维网上的页面展示
1998年 XML   可扩展的标记语言(Extensible Markup Language)
HTML有不少的缺陷,HTML语言的标记不能自定义,HTML语言的标记本身不能用来描述数据,HTML语言的标记没有国际化(不同浏览器显示同一页面的效果可能不一样)
W3C组织在1998年推出了可扩展标记语言XML
XML语言的本身是用来替代HTML语言的,但是俩种语言还有一定差异的,所以中间出现了一种过渡的语言:XHTML
但实际上XML语言已经很难替代HTML语言了,因为HTML语言的使用在整个万维网上使用太广泛了。

二  XML有什么作用,为什么要学习XML
第一个需求: 数据传输需要一定的格式
1.数据的可读性
2.将来的扩展
3.将来的维护
XML现在已经是业内传输数据的标准,它和语言无关
第二个需求: 配置文件,之前使用的.properties资源文件中描述的信息不丰富

第三个需求: 保存数据,充当小型的数据库
保存数据一般是使用数据库保存,或者使用一般的文件保存,这个时候也可以选择XML文件,因为XML可以描述复杂的数据关系。从普通文件中读取数据的速度肯定是比从数据库中读取数据的速度快,只不过这样不是很安全而已



三 语法
1.文档声明
XML文件的后缀为.xml
XML文本要求文件有一个头部声明: 用来告诉解析器一些相关信息
<?xml version="1.0" encoding="UTF-8"?>
表明当前文件是xml文件,XML版本为1.0,文件内容使用的字符编码为UTF-8
注意:要小心在系统中这个xml文件保存时候的编码,是否和文件内容中设置的编码一致


ansi (American National Standards Institute)美国国家标准协会
ansi编码 是这个协会组织制定的一种字符编码
ansi编码在不同国家表示是不用的 中文操作系统中的ansi编码是GB2312
2.元素
2.1
每个XML文档必须有且只有一个根元素。
根元素是一个完全包括文档中其他所有元素的元素。
根元素的起始标记要放在所有其他元素的起始标记之前。
根元素的结束标记要放在所有其他元素的结束标记之后。

2.2
XML元素指XML文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写形式,例如:
包含标签体:<a>www.baidu.com</a>
不含标签体的:<a></a>, 可以简写为:<a/>
一个标签中也可以嵌套若干子标签。但所有标签必须合理的嵌套,绝对不允许交叉嵌套 ,例如:
<a>你好!<b>程序员</a></b> 

2.3
对于XML标签中出现的所有空格和换行,XML解析程序都会当作标签内容进行处理。例如:下面两段内容的意义是不一样的。
<name>tom</name>


<name>
tom
</name>


由于在XML中,空格和换行都作为原始内容被处理,所以,在编写XML文件时,要特别注意。但是在一些封装好的解析方式中,是可以忽略掉这些空格和换行的.(例如在一些第三方提供的jar包中)

2.4
一个XML元素可以包含字母、数字以及其它一些可见字符,但必须遵守下面的一些规范
区分大小写,例如,<P>和<p>是两个不同的标记。
不能以数字或"_" (下划线)开头。
不能包含空格。

3.属性
<student id="100">
<name>TOM</name>
</student>


属性值用双引号(")或单引号(')分隔
一个元素可以有多个属性,它的基本格式为:
<元素名 属性名="属性值">
特定的属性名称在同一个元素标记中只能出现一次
属性值不能包括<, >, &

4.实体 entity
&实体名;

xml文件中有些特殊的字符是不能直接表示出来的,例如:大于号,小于号,单引号、双引号等等 
预定义字符实体,由XML规范预先定义好了
&lt; <   less than
&gt; >    great than
&amp; &
&quot; "
&apos; '

自定义实体
格式:
<!DOCTYPE courses[
<!ENTITY 实体名 实体内容>
]>


eg:
<!DOCTYPE courses[
<!ENTITY company "昆山杰普软件科技有限公司">
]>
其中:company为实体名称
 "昆山杰普软件科技有限公司"是实体内容
 实体的使用:&company;




4.注释
<!--这是一个注释-->
注释内容中不要出现- -;
不要把注释放在标记中间;
<Name <!--the name--> > TOM </Name>
注释不能嵌套;
可以在除标记以外的任何地方放注释


5.PCDATA,CDATA
PCDATA (Parsed Character Data) 会被xml文档解析器解析的,但是有些特殊字符需要借助实体才可以被解析器解析。XML文件中的正常内容基本都是PCDATA


CDATA (Character Data) 不会被xml文档解析器解析的,按字符串原样输出。有些内容不想让解析,按照内容原样输出就可以了,这种情况可以使用CDATA
格式:<![CDATA[需要原样输出的字符串]]>



6.处理指令
处理指令,简称PI (processing instruction)。处理指令用来指挥解析引擎如何解析XML文档内容。


例如,在XML文档中可以使用xml-stylesheet指令,通知XML解析引擎,使用css文件显示xml文档内容。
<?xml-stylesheet type="text/css" href="css文件路径"?>


处理指令必须以 <? 作为开头,以 ?> 作为结尾,XML文件的头部声明语句就是最常见的一种处理指令。 
XML文件中可以有多个处理指令
例如: class.xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="class.css" type="text/css"?>
<class>
<student id="001">
<name>张三</name>
<age>20</age>
</student>
<student id="002">
<name>李四</name>
<age>20</age>
</student>
</class>


class.css文件:
name{
font-size:30px;
font-weight:bold;
color:red;
}
age{
font-size:30px;
font-weight:bold;
color:green;
}




四  XML命名空间
XML 命名空间提供避免元素命名冲突的方法。
在 XML 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。


例如:
这个 XML 文档携带着某个表格中的信息:
<table>
  <tr>
  <td>Apples</td>
  <td>Bananas</td>
  </tr>
</table>
这个 XML 文档携带有关桌子的信息(一件家具):
<table>
  <name>茶几</name>
  <width>80</width>
  <length>120</length>
</table>
假如这两个 XML 文档被一起使用,由于两个文档都包含带有不同内容和定义的 <table> 元素,就会发生命名冲突。
XML 解析器无法确定如何处理这类冲突。



第一种解决方案:
使用前缀来避免命名冲突
此文档带有某个表格中的信息:
<h:table>
  <h:tr>
  <h:td>Apples</h:td>
  <h:td>Bananas</h:td>
  </h:tr>
</h:table>
此 XML 文档携带着有关一件家具的信息:
<f:table>
  <f:name>茶几</f:name>
  <f:width>80</f:width>
  <f:length>120</f:length>
</f:table>


现在,命名冲突不存在了,这是由于两个文档都使用了不同的名称来命名它们的 <table> 元素 (<h:table> 和 <f:table>)。
通过使用前缀,我们创建了两种不同类型的 <table> 元素。


第二种解决方案:
使用命名空间(Namespaces)
这个 XML 文档携带着某个表格中的信息:
<h:table xmlns:h="http://www.briup.com/h">
  <h:tr>
  <h:td>Apples</h:td>
  <h:td>Bananas</h:td>
  </h:tr>
</h:table>
此 XML 文档携带着有关一件家具的信息:
<f:table xmlns:f="http://www.briup.com/f">
  <f:name>茶几</f:name>
  <f:width>80</f:width>
  <f:length>120</f:length>
</f:table>
与仅仅使用前缀不同,我们为 <table> 标签添加了一个 xmlns 属性,这样就为前缀赋予了一个与某个命名空间相关联的限定名称。



XML Namespace (xmlns) 属性
XML 命名空间属性被放置于元素的开始标签之中,并使用以下的语法:
xmlns:namespace-prefix="namespaceURI"
当命名空间被定义在元素的开始标签中时,所有带有相同前缀的子元素都会与同一个命名空间相关联。
用于标示命名空间的地址不会被解析器用于查找信息。其惟一的作用是赋予命名空间一个惟一的名称



默认的命名空间(Default Namespaces) 使用以下的语法:
xmlns="namespaceURI"
为元素定义默认的命名空间可以让我们省去在所有的子元素中使用前缀的工作。
这个 XML 文档携带着某个表格中的信息:
<table xmlns="http://www.briup.com">
  <tr>
  <td>Apples</td>
  <td>Bananas</td>
  </tr>
</table>
此 XML 文档携带着有关一件家具的信息:
<table xmlns="http://www.baidu.com">
  <name>茶几</name>
  <width>80</width>
  <length>120</length>
</table>










第二章:DTD  .dtd    scheme   .xsd
DTD的定义:描述元素、属性和其他杂项在xml文档中
          的使用规则的说明
DTD的分类:
1).外部的DTD:DTD和xml文档不在同一个文件中
<!DOCTYPE 根元素 SYSTEM "文件名">
<!DOCTYPE 根元素 PUBLIC "描述" "URL">
2).内部的DTD:DTD和xml文档在同一个文件中
<!DOCTYPE 根元素 [元素声明]>
3).混合的DTD:既有外部DTD,又有内部DTD
DTD的目的:
验证该xml文档是否是有效的xml文档
如果一个良构的xml文档满足了DTD的声明就是一个有效
的xml文档。
注意:良构 不一定  有效,但是有效一定良构


DTD在元素中的声明:
格式:<!ELEMENT  元素名 (内容模式)>
内容模式:
1).(#PCDATA):元素内容为字符或者为空
2).EMPTY:元素内容为空
<!ELEMENT  name (EMPTY)>
3).ANY:元素内容为任意的,主要是使用在元素内容不确定的情况下
4).(Child Elements): ,   |   +  *  ?
<!ELEMENT  name (lastname?,firstname)>


5).混合元素
eg:<!ELEMENT root (#PCDATA|name|age)*>
<root>
<name></name>
<age></age>
</root>
子元素可以是name,也可以是age,顺序没有关系,频率也没有关系
注意:浏览器是非验证的解析器,不会验证xml的有效性
     validate===>验证xml文档


属性的DTD声明:
格式:<!ATTLIST 元素名  属性名  属性类型 属性默认值 >
属性类型:
1).ID:属性值必须唯一,属性值必须满足命名规则
2).enumerated:(枚举值1|枚举值2|枚举值3...),属性值必须在枚举值中
3).CDATA:属性值为字符
属性默认值:
1).#REQUIRED:属性必须出现在元素的开始标签中。
2).#IMPLIED:属性可以不出现,并且当它不出现的时候没有默认值 implied
3).attribute-value:属性可以不出现,并且当它不出现的时候是有默认值的,而该属性
          的默认值就是atttibute-value
4).#FIXED:属性可以不出现,但是如果出现的话必须是指定的属性值,不出现的话也是
指定的默认值




<!--
这个表示students元素里面有子元素student
+表示这个student元素只能出现1次或者多次
?表示这个元素只能0次或者1次
*表示这个元素只能出现0次或者多次
默认情况下(没有任何符号修饰),表示这个元素有且只出现1次
 -->
<!ELEMENT students (student+)>
<!-- 
这个表示student元素下面出现的标签顺序为name age score,
如果出现的顺序不是按照这里面规定的,那么也是会报错的
 -->
<!ELEMENT student (name,age?,score*)>
<!-- #REQUIRED 表示这个元素出现,那么这个定义的属性就必须出现,不出现xml就报错 -->
<!ATTLIST student id CDATA #REQUIRED>
<!-- 
定义上面已经列出来的name元素里面没有子元素,
name中定义了标签才可以有子标签,没定义就没有子标签
并且这个name元素中的文本节点为PCDATA的数据内容 
-->
<!ELEMENT name (#PCDATA)>
<!-- #IMPLIED 表示这个元素出现,那么这个定义的属性可以出现也可以不出现 -->
<!ATTLIST name firstName CDATA #IMPLIED>
<!ELEMENT age (#PCDATA)>
<!-- #FIXED 这个定义的元素的属性可以出现也可以不出现,如果出现那么就一定要有值为20 -->
<!ATTLIST age xuAge CDATA #FIXED "20">
<!ELEMENT score (#PCDATA)>
<!-- sel属性的值必须这三种的其中一个 -->
<!ATTLIST score sel (60|80|100) #REQUIRED>



原创粉丝点击