zoukankan      html  css  js  c++  java
  • XML学习笔录

    XML的全称是Extensible Markup Language,即可扩展标记语言,它由SGML(Standard Generalized Markup Language)发展而来,允许开发者自由定义标签,可以将标签和内容有效分离。不同于HTML,XML不再侧重于数据如何表现,而是更多地关注数据如何存储和传输。因此它组建成为一种跨平台的数据交换格式,一种轻量级的持久化方案。通过使用XML,开发者可以在不同系统之间进行数据交换,还可以将程序状态保存到XML文件中,而无须使用关系数据库。

    XML广泛应用与javaEE开发的各个方面,绝大部分java应用和框架都在使用XML作为配置文件来管理各java组件,java作为最流行的跨平台编程语言,不可避免地需要在不同平台之间进行数据交换,而XML则为这种数据交换提供了支持。除此之外,XML还是WebService技术的重要基础,而WebService技术则是异构系统整合的重要手段,甚至为SOA(面向服务的架构)也提供了底层技术实现。由此可见,对于实际企业开发具有举足轻重的作用。

    和HTML相比,XML具有简单易用,扩展性好等特点,而且XML语言严格要求嵌套、配对,并遵守语义约束,结构清晰,数据逻辑和现实逻辑分离,XML文件需要特定的程序的进行处理。下面找一个案例文件来看看XML的整体结构:

    <?xml version="1.0" encoding="GB2312" standalone="no"?>

    <?xml-stylesheet type="text/xsl" href="mystyle.xsl"?>
    <专有名词列表>
        <专有名词>
             <名词>XML</名词>         
             <解释>XML是一种可扩展的源置标语言,它可用以规定新的置标规则,并根据这个规则组织数据</解释>
             <示例>
                 <!-- 一个XML的例子 -->
                 <![CDATA[
                    <联系人>
                    <姓名>张三</姓名>
                    <EMAIL>zhang@aaa.com</EMAIL>
                    </联系人>
                
    ]]>
            </示例>
        </专有名词>

    </专有名词列表> 

      一个XML文件基本组成是:

    XML声明

    处理指示(可选)

    XML元素

    一)声明

    典型的XML文件的文件声明如下:

    <?xml version="1.0" encoding="GB2312" standalone="yes" ?>

    <? ?>为处理指令, 如<?xml-stylesheet type="text/css" href="config.css" ?>   standalone表示文档是否需要引用其他资源,该属性只接受yes或者no两个值。encoding表示对该文档进行解码所用的字符集。xml使用 <!--  注释  -->来进行注释,注释不能嵌套,如果有声明的话,则在声明前不能有注释。

    二)元素

    元素即为标签,通常由开始标签、元素内容和结束标签组成,例如<name>jobs</name>,一个文件只有一个根标签,元素必须合理结束。

    空格和换行都可以作为原始内容被处理,对于XML文档而言是区分大小写的。

    如果元素有属性值的话要用双引号(“)或者单引号(‘) 包起来。

    一些特殊符号如> ,<等不会被正确解析,为了正确处理这些字符XML允许使用实体来表示这些特殊字符,其内置了5个实体引用:

        &lt;    <   ||    &gt;   >   ||   &amp;    &      ||    &apos;     '       ||      &quot;         "

      如果本身内容需要解析引擎解析,这需要使用特殊标记 CDATA,其正确使用方法为:

    <![CDATA[   需要显示的内容 ]]> 

     关于注释,XML的注释中不能出现”-“ 或者”--“,容易与”-->“ 结束标记混淆,不要把注释放在标记之中,此外注释不可以嵌套。

    对于一个有效且格式良好的XML文档,必须有语义约束, 语义约束可以规定XML文档出现哪些元素,各元素之间的父子关系,以及每个元素内部都可以出现哪些子元素。可以支持哪些属性等。如果提供更先进的语义约束,还可以约束XML文档内各元素和各属性的数据类型等。目前有两种文档定义语义约束方式,一种是采用DTD作为语义约束,另一种是采用XML Schema作为语义约束。

     一)采用DTD约束

    XML的语义约束其实是一段代码,如:

    <!DOCTYPE 元素名[

    元素描述

    ]>

    该代码可以放在XML文件中,也可以单独放在一个文件中,如果单独放在一个文件中,该文件被称为约束文件,扩展名为.dtd。文档约束定义之后,我们需要自己引入到XML文件中来,当然内部DTD直接就在文件中了,若是外部DTD则需要使用形如如下声明格式引用:

    <!DOCTYPE  根元素名  SYSTEM  “DTD文件的URI” >

    DTD文件的URI可以使用绝对路径,也可使用相对路径,这种外部DTD文件,可以被多个XML文件共享 。

    而大部分时候我们使用的DTD都是公用的DTD文件,由某个权威机构或者特定行业制定的,此DTD文件我们需要使用如下声明格式引用:

    <!DOCTYPE 根元素名   PUBLIC   “DTD的标示名”  “公用DTD的URI” >

      1)对元素的约束

    元素类型定义的全称是Element Type Definition,简称ETD,ETD的语法格式如下:

    <!ELEMENT   元素名   元素类型描述 >

    有下列几种情况:

    <!DOCTYPE   联系人列表[

    <!ELEMENT  联系人列表  ANY>

    <!ELEMENT  联系人 (姓名) >

    <!ELEMENT  姓名 (#PCDATA) >

    <!ELEMENT  联系人  (姓名 EMAIL) >

    <!ELEMENT  联系人   (姓名,EMAIL) >

    <!ELEMENT 联系人(姓名,EMAIL+)>
    <!ELEMENT 联系人(姓名,EMAIL*)>

    <!ELEMENT 联系人(姓名,EMAIL)+>

    <!ELEMENT 联系人(姓名,(电话|EMAIL))>

    <!ELEMENT 联系人(姓名,(电话|EMAIL),地址?)>

    <!ELEMENT 联系人(姓名|电话|EMAIL|#PCDATA)*>
      <!ELEMENT HR EMPTY>

      对于正则表达式的形式,“+” 表示1或多,“?”表示 0或1,“*” 表示0或多,“,”表示有顺序,“|”表示或

    2)属性的约束

    对于属性的约束格式如下:

    <!ATTLIST 属性所属的元素  属性名  属性类型  [元素对属性的约束]  [默认值] >

    其中元素对属性的约束有四种,#REQUIRED,#IMPLIED,#FIXED,默认值

    #REQUIRED:必需的属性,意味着必需为元素提供该属性,如 <!ATTLIST 作者  地址  CDATA  #REQUIRED >

      #IMPLIED:该属性是可有可无的。

    #FIXED:该属性的值是固定的,定义时必须指定固定值,如 <!ATTLIST 作者 地址 CDATA #FIXED "北京" >

    如果是#FIXED,则必需指定默认值,其他则不需要。 

    对于属性类型,DTD支持的属性类型很多,如CDATA,ENUMERATED,ID,ENTITY,NMTOKEN,NOTATION等等,而对于实体(ENTITY)来说,DTD中有两种实体,一般实体和参数实体,两种实体的引用方式如下:

    一般: <!ENTITY 名称 “内容” >  ;  而参数实体 ,  <!ENTITY % 名称  “内容”  > 

    如要声明为外部实体则需添加SYSTEM,如DTD引入类似,引用实体时,需要使用 “&实体名”。 举例如下:

    <!ENTITY % TAG_NAMES "姓名 | EMAIL | 电话 | 地址">
    <!ELEMENT 个人联系信息 (%TAG_NAMES; | 生日)>
    <!ELEMENT 客户联系信息 (%TAG_NAMES; | 公司名)>
     

      二)采用XML Schema约束 

     XML Schema提供了比DTD更强的语义约束,不仅可以定义XML文档的结构,还可以规范文档的内容。XML Schema本身就是一个XML文档,其基于标签的语法比DTD的可读性更强。由于Schema约束相当的复杂,本文只介绍简单部分,也是笔者学习时的内容,力求能读懂XML约束文件,常见的XML文件不会感到生疏即可。

    在Schema文档中它有一个根元素就是schema,编写了一个XML Schema约束文档后,通常需要把这个文件中声明的元素绑定到一个URI地址上,在XML Schema技术中有一个专业术语来描述这个过程,即把XML Schema文档声明的元素绑定到一个名称空间上,以后XML文件就可以通过这个URI(即名称空间)来告诉解析引擎,xml文档中编写的元素来自哪里,被谁约束。在XML Schema中,每个约束模式文档都可以被赋以一个唯一的名称空间,名称空间用一个唯一的URI(Uniform Resource Identifier,统一资源标识符)表示。

    Schema约束采用为来自不同模式文件的元素添加前缀,来代替不同的命名空间,来解决名称冲突问题。一个没有使用命名空间的Schema文件,也可以导入XML文档中。xmls[:xxx]用于为指定XML文档引入语义约束,XXX便是约束对应的命名空间。

      下面看一下Schema的例子:

    <?xml version="1.0"?>           

     <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

      targetNamespace="http://www.w3school.com.cn" 

    xmlns="http://www.w3school.com.cn" 

    elementFormDefault="qualified">

    <xs:element name="note">

    <xs:complexType>

    <xs:sequence>

    <xs:element name="to" type="xs:string"/>

    <xs:element name="from" type="xs:string"/>

    <xs:element name="heading" type="xs:string"/>

    <xs:element name="body" type="xs:string"/>

    </xs:sequence>

    </xs:complexType>

    </xs:element>

    </xs:schema>

     

       <schema>元素是每一个XML Schema的根元素,XML Schema约束文件类似如下:

    <?xml version="1.0"?>  

    <xs:schema>

    . .. ...

    </xs:schema>

      xmlns:xs=http://www.w3.org/2001/XMLSchema 说明了schema用到的元素和数据类型来自的命名空间。

      targetNamespace="http://www.w3school.com.cn"显示被此schema定义的元素(note,to,from,heading,body)来自命名空间:"http://www.w3school.com.cn"。

    xmlns="http://www.w3school.com.cn" 指出默认命名空间为:http://www.w3school.com.cn

    elementFormDefault="qualified" 指出任何XML实例文档所使用的且在此schema中声明过的元素必须被命名空间限定。

    如下是在XML文档中使用该约束时便可以这样写:

     <?xml version="1.0"?> 

    <note xmlns="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>

     xmlns=http://www.w3school.com.cn告诉schema验证器,在此XML文档中使用的所有元素都被声明于"http://www.w3school.com.cn"这个命名空间。一旦拥有了可用的XML Schema实例命名空间:xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance 就可以使用schemaLocation属性了。此属性有两个值。第一个值是需要使用的命名空间。第二个值是供命名空间使用的XML schema的位置:

    xsi:schemaLocation=http://www.w3school.com.cn note.xsd 

     
    1)用Schema定义元素及其内容

      XSD的元素有简易元素和复合元素,简易元素指那些仅包含文本的元素。它丌会包含任何其他的元素戒属性。也可向数据类型添加限定(即facets),以此来限制它的内容,戒者您可以要求数据匹配某种特定的模式。

    如下定义方法: <xs:element name="xxx" type="yyy"/> 

      常用类型有xs:string; xs:decimal; xs:integer; xs:boolean; xs:date; xs:time。

    如: <xs:element name="age" type="xs:integer"/> 

    加上默认值之后:<xs:element name="color" type="xs:string" default="red"/> ,固定值使用fixed。

     2)用Schema定义属性及其内容

    所有的属性均作为简易类型来声明 ,简易元素无法拥有属性。假如某个元素拥有属性,它就会被当作某种复合类型。但是属性本身总是作为简易类型被声明的。

    如下定义方法:<xs:attribute name="xxx" type="yyy"/> 

    如下列子:<xs:attribute name="lang" type="xs:string" default="EN"/> 此处使用了默认值。

    <xs:attribute name="lang" type="xs:string" use="required"/>  规定属性为必选。

    3)限定facet

    通过XSD可以对元素或者属性进行限定,这些限定被称为facet ,如下列子对大小范围的限定:

    <xs:restriction base="xs:integer">  

    <xs:minInclusive value="0"/>

    <xs:maxInclusive value="120"/>

    </xs:restriction>

    当然还可以使用<xs:enumeration ...>一组值,<xs:pattern .....> 一系列值, <xs:whiteSpace.....> 空白字符,<xs:length....> 长度等等对数据类型的限定。

    下面讲述复合元素的使用情况: 

    11)复合元素指包含其他元素及/或属性的XML元素,一个例子如下:

    <employee>  

    <firstname>John</firstname>

    <lastname>Smith</lastname>

    </employee>

     如下XSD写法:

    <xs:element name="employee">  

    <xs:complexType>

    <xs:sequence>

    <xs:element name="firstname" type="xs:string"/>

    <xs:element name="lastname" type="xs:string"/>

    </xs:sequence>

    </xs:complexType>

    </xs:element>

     "employee"元素可以使用type属性,这个属性的作用是引用要使用的复合类型的名称,这是需要在complexType 加入type属性,type属性可以共享。

    还可以在已有的复合元素乊上以某个复合元素为基础,然后添加一些元素,如下方法:

    <xs:complexType name="personinfo">

    .......................... 

     </xs:complexType>

    <xs:complexType name="fullpersoninfo">  

    <xs:complexContent>

      <xs:extension base="personinfo">

    。。。。。。。。。 

    </xs:extension> 

    </xs:complexContent>

      </xs:complexType>

     22)复合类型指示器

     通过指示器,我们可以控制在文档中使用元素的方式。常见的有7种指示器:

    Order指示器:

     All,  用于定义元素的顺序;

    Choice,规定可出现某个子元素戒者可出现另外一个子元素(非此即彼);

    Squence ,规定子元素必须按照特定的顺序出现

    Occurrence指示器: 

    maxOccurs指示器可规定某个元素可出现的最大次数,minOccurs指示器可规定某个元素能够出现的最小次数.如需使某个元素的出现次数丌受限制,请使用maxOccurs="unbounded"这个声明.

    Group 指示器: Group name,attributeGroup name,Group指示器用于定义相关的数批元素。

    此外Schema还有全局元素,本地元素,替换等机制,以及各类数据类型的扩展,和DTD有点类似,在此就不一一介绍了。

     

  • 相关阅读:
    JAVA集合类汇总
    springmvc执行流程详细介绍
    java文件上传和下载
    Java中的Filter过滤器
    JSTL介绍及使用
    JSP知识汇总
    JAVA集合类汇总
    服务治理框架dubbo中zookeeper的使用
    map进程数量和reduce进程数量
    Hadoop的序列化
  • 原文地址:https://www.cnblogs.com/kingcucumber/p/2833090.html
Copyright © 2011-2022 走看看