XML_(1)_基础浅谈

        学习XML也有三四个月了,现在自己复习一下,XML的基础知识,总结一下过去的学习成果.

一份简单的XML文档如下:
<?xml version="1.0" encoding="gb2312"?>    //此为PI(其实这可有可无,格式是前后要有?)
<!--
这是XML文档中的注释                                    //这个就不用说啦
-->
<book xmlns="http://www.cnblogs.com/ArisHuang">  
                                                        // book为根元素rootElement(注:此不是根结点rootNode两者是有区别的)
                                                        //xmlns则为命名空间
 <title>XML</title>                               //后者是隐含有的,但每个XML文档一定要有rootElement
 <author id="123">lisongtao</author>        //id 则为author的属性
</book>

    以上是XML文档的简单回归,下面就进行复习XML的正确性:
一份格式语法正确的XML文档则为"良构的XML文档",而若有其他相应的验证文档则为"合法的XML文档"
至于"良构的XML文档"就不必多说了,跟上面所示的XML文档没什么两样,大不了就是复杂点.但"合法的XML文档"则不同,下面就谈论下何为"合法的XML文档":
    1.

DTD架构

文档类型定义DTDDocument Type Definition)提供了定义文档规范的一种方法。DTD定义XML文档的基本结构,定义在XML文档中出现的元素、这些元素出现的次序、元素间的关系、元素可使用的属性、文档可使用的实体以及XML文档结构的其他详细信息。

一、  DTD声明

   DTD声明指将XML文件和DTD架构文件进行联系。DTD声明出现在XML文档的指令之后和根元素之前。

[1] <?xml version='1.0' encoding="GB2312" standalone="yes" ?>

<!DOCTYPE 产品目录 [<!ELEMENT 产品目录 (#PCDATA)>]>

<产品目录>文本内容</产品目录>

        说明:第二行就是文档类型声明:其中[ ]中的内容是文档类型定义,它定义了文档中使用的所有元素。

 

    XML规范定义了两种提供DTD声明的方法:内部文档定义(内联DTD模式 )和外部文档类型定义(引用外部DTD文件

1、      内部文档定义

       文档类型定义的内容包含在XML文档的DTD声明中,如上1所示。其基本表达语法为:

         <!DOCTYPE  根元素名 [元素定义]>

2、      外部文档类型定义

文档类型定义的内容由外部的DTD文件提供。外部DTD更实用、灵活。为了引用一个外部DTD文件,必须修改XML声明。XML声明中必须说明这个文档不是自成一体的,即standalone="yes",应该改为:standalone="no"。外部DTD声明的语法为:

<! DOCTYPE  根元素名 SYSTEM  "DTD文件的相对或绝对路径" >

[2]一个DTD文件如下3_1.dtd

<?xml version='1.0' encoding="gb2312" ?>

<!ELEMENT 产品目录 (#PCDATA)>

XML文件中引入DTD文件如下3_1.xml

<?xml version='1.0' encoding="gb2312" standalone="no" ?>

<!DOCTYPE  产品目录  SYSTEM  "3.1.dtd">

<产品目录>文本内容</产品目录>

 

   练习:在XML文档中分别进行内部和外部DTD文件的引用。

    ex1.dtd

<!ELEMENT note (to,from,heading,body)>

<!ELEMENT to (#PCDATA)>

<!ELEMENT from (#PCDATA)>

<!ELEMENT heading (#PCDATA)>

<!ELEMENT body (#PCDATA)>

        ex1.xml

<?xml version="1.0"?>

<note>

<to>Tove</to>

<from>Jani</from>

<heading>Reminder</heading>

<body>Don't forget me this weekend!</body>

</note>

 

二、  定义元素

      元素是XML文档的核心。元素类型声明的语法为:

      <!ELEMENT  元素名  元素内容描述>

      元素定义主要指定元素的名称和内容。元素命名要遵守XML对名称的限制。元素内容可以分为以下5种类型:字符或文本数据(#PCDATA)、空(EMPTY)、元素列表(子元素列表)、混合以及任意(ANY)。

      [3]

           1<!ELEMENT to (#PCDATA)>        对应XML例子:<to>zxc</to>

            2<!ELEMENT from (#PCDATA)>      对应XML例子:<to>Jani</to>

3<!ELEMENT note  (to,from,heading,body)>  

对应XML例子:

  <note>

<to/>

<from/>

<heading/>

<body/>

</note>

          4 <!ELEMENT br EMPTY>     对应XML例子:<br></br>

          5 <!ELEMENT note ANY>    

对应XML例子:

   <note>

<to/>

<from/>

<heading/>

<body/>

</note>

          6、实写出满足以下DTD架构(Computer1.dtd)XML文档实例:

              <?xml version='1.0' encoding="gb2312"?>

              <!ELEMENT  产品目录  (笔记本电脑)>

              <!ELEMENT  笔记本电脑 (型号,CPU,内存,硬盘)>

              <!ELEMENT  型号  (#PCDATA)>

              <!ELEMENT  CPU  (#PCDATA)>

              <!ELEMENT  内存  (#PCDATA)>

              <!ELEMENT  硬盘  (#PCDATA)>
                <?xml version='1.0' encoding="gb2312" standalone="no"?>
                <!DOCTYPE 产品目录 SYSTEM "Computer1.dtd">
                <产品目录>
                  <笔记本电脑>
                 <型号>T-2004</型号>
                 <CPU>CPU-2004</CPU>
                 <内存>1G</内存>
                 <硬盘>80G</硬盘>
                  </笔记本电脑>
                </产品目录>
    
       DTD中,可以使用一些特殊的符号来表示元素允许出现的次数、顺序等。如下表-1列出了DTD元素定义符号及含义:

-1

元素字符

   

+

出现一次或多次

*

出现零次或多次

?

不出现或只出现一次

( )

一组出现的内容

|

,

ADN

 

1、        定义元素及其子元素

编写DTD一般从外到内,逐级定义元素是最容易的。如果要求一个元素的各个子元素在文档中出现的顺序必须与DTD定义顺序一直,则必须采用下列定义方式:

             <!ELEMENT  元素名 (子元素1,子元素2,……)>

               <!ELEMENT  子元素1  元素内容描述>

               <!ELEMENT  子元素2  元素内容描述>

                ……

[4]编写满足下列XML文档的DTD架构:

<?xml version='1.0' encoding="gb2312" standalone="no" ?>

<!DOCTYPE   产品目录 SYSTEM  "Computer1.dtd">

<产品目录>

<笔记本电脑>

  <型号>T-2004</型号>

  <CPU>CPU-2004</CPU>

  <内存>1G</内存>

  <硬盘>80G</硬盘>

</笔记本电脑>

</产品目录>

如果允许一个元素的各子元素以任意顺序出现,甚至有的不出现,可以采用下列方法定义:

                            <!ELEMENT  元素名 ANY>

                  <!ELEMENT  子元素1  元素内容描述>

                  <!ELEMENT  子元素2  元素内容描述>

                ……

2、        定义重复元素

重复出现的符号见表-1

[6]

1<!ELEMENT note (message)>  表示子元素message只能在note中出现一次

2<!ELEMENT note (message+)>  表示子元素messagenote中至少出现一次

3<!ELEMENT note (message*)>  表示子元素messagenote中至少0次或多次(任意次)

4<!ELEMENT note (message?)>   表示子元素messagenote中至少0次或1

 

3、        定义选择项

用符号“|”表示一个OR操作,只能从列表中选择一项。

[7]

1)对 “联系方式元素假设:必须包含一个或多个 “EM地址,或则包含一个电话号码DTD定义为:

          < !ELEMENT  联系方式 (EM地址+ |电话号码)>

  2)说明以下DTD的意思:<!ELEMENT note (to,from,header, (message*|body))>,并写出XML片段。

 

三、  定义属性

DTD中定义属性的语法是:

<!ATTLIST 元素名 属性名  属性类型  缺省值>

[8]DTD 实例:

<!ATTLIST  payment  type  CDATA  "check">

XML 实例:

<payment type="check" />

 

以下-2中是属性类型的选项:

                             -2

类型

描述

CDATA

值为字符数据 (character data)

(en1|en2|……)

此值是枚举列表中的一个值

ID

值为唯一的 id

IDREF

值为另外一个元素的 id

IDREFS

值为其他 id 的列表

NMTOKEN

值为合法的 XML 名称

NMTOKENS

值为合法的 XML 名称的列表

ENTITY

值是一个实体

ENTITIES

值是一个实体列表

NOTATION

此值是符号的名称

xml:

值是一个预定义的 XML

以下-3中是缺省值的选项:

                              -3

解释

属性的默认值

#REQUIRED

属性值是必需的

#IMPLIED

属性不是必需的

#FIXED  value

属性值是固定的

 


    2.XDR  一种基于XML的过渡性Microsoft架构技术(可以不管了)      

    3. 

XSD架构

XSD架构和DTD架构相比有一个最为显著的特征,就是它对数据类型的支持。

[1]比较下列XML片段的DTD定义和XSD定义。

     XML文档片段:

        <订单>

                 <订单号>1234</订单号>

                 <产品编号>J123456</产品编号>

             </订单>

   DTD定义

        <! ELEMENT  订单 (订单号, 产品编号)>

        <! ELEMENT  订单号 (#PCDATA)>

        <! ELEMENT  产品编号(#PCDATA)>

   XSD定义

     <element  name=’订单  type=’orderType’></element>

       <complexType  name=’orderType’>

          <sequence>

                <element  name=’订单号  type=’Integer’></element>

                 <element  name=’产品编号  type=’ProductCode’></element>

                     <simpleType  name=’ ProductCode’>

                        <restriction  base=’string’>

                                    <pattern  value=’[A-Z]{1}d{6}’></pattern>

                     </restriction>

              </simpleType>

          </sequence>

       </complexType>

 

 

一、  XSD结构

一个XSD文档结构如下:

<?xml version="1.0"  encoding="gb2312"?>

<xsd:schema  targetNamespace="目标命名空间"

 xmlns:xsd="引用的命名空间"

……>

           ……(关于元素、属性的定义)

     </xsd:schema>

 

说明:“targetNamespace”指该XSD的目标命名空间,作用是给该XSD文档取一个名字。

      xmlns:xsd”指该XSD引用的命名空间,作用是在该XSD文档中的元素中引用该名称。可以定义多个引用命名空间。

 

二、  XML文档中引用XSD架构

1、        使用“schemaLoaction”属性引用XSD文档

如果XSD文档中包含了targetNamespace属性,在XML文档中就可以通过schemaLoaction来引用XSD文档。语法如下:

<根元素 xmlns=”XSD目标命名空间

xmlns:前缀=URI

前缀: schemaLoaction=”XSD目标命名空间  XSD文件路径”>

                 ……

             </根元素>

 

2、        使用“noNamespaceSchemaLoaction”属性引用XSD文档

如果XSD文档中不包含targetNamespace属性,则采用noNamespaceSchemaLoaction属性来引用XSD文档。语法如下:

<根元素     xmlns:前缀=URI

前缀: noNamespaceSchemaLoaction=” XSD文件路径”>

                 ……

  </根元素>

 

三、  定义元素

   XSD中,元素用element来声明语法为

  <element name=”元素名

type=”类型名

default=”缺省值

nillable=”true|false(是否为空)”

maxOccurs=”最大出现次数(当值为unbounded时表示不限最大数量)”

minOccurs=”至少出现次数(当maxOccursminOccurs都没定义时,该元素只能出现一次)

fixed=”固定值(不能与default一起定义)”

……>

 

XSD中,元素的内容由其定义的elementtype属性来定义。元素类型包括内置类型、简单类型和复合类型。

1、      内置类型

内置类型指定的数据可以作为内容出现在XML文档中。内置类型类似大多数编程语言中的数据类型。有19种基本的类型和25种派生出的类型,如:stringintegerdecimal等。使用内置类型来定义元素很简单,只要指定元素名和类型名就可以了。

[练习:]创建可以取整数的内置类型元素名称为订单号

 

2、      简单类型

不含属性或其他元素的元素都为简单类型元素。简单类型用“simpleType”元素来自定义。语法如下:

 <simpleType  name=”类型名   ……>类型定义描述</simpleType>

XSD定义10几种用于简单类型定义描述的元素。下面我们来讨论几个:

1)        restriction:指定该元素类型的数据类型

2)        pattern:取值的正则表达式

3)        minInclusive maxInclusive:描述元素的取值范围

4)        enumeration:取值范围为一组不同的枚举值。

          [练习:]创建一个值在1~100之间的整数的简单类型,类型名为quantityType

 

3、      复合类型

在架构中,复合类型用于至少包含一个子元素或属性的元素。

[例:]<xsd:complexType  name="authorName">

        <xsd:sequence>

            <xsd:element name="first-name"  type="xsd:string" />

            <xsd:element name="last-name"  type="xsd:string" />

        </xsd:sequence>

     </xsd:complexType>

 

说明:<xsd:complexType  name="authorName">是一个复合类型的元素定义。

      <xsd:sequence>是复合类型定义的组合器,包括sequencechoiceall,它们用来定义子元素出现形式的约束条件。Sequence表示必须按定义的顺序出现的XML文档示例中;choice表示只允许其中的一个子元素出现在XML文档示例中;all表示所有子元素同时出现一次,或则不出现,而且他们可以按任意的顺序出现在XML文档的示例中。

 

四、  定义属性

   属性定义方法:

    <attribute name=”属性名

type=”类型名”(同元素定义一样)

default=”缺省值

fixed=”固定值(不能与default一起定义)”

……>

    
           以上是自己在之前学过的XML基础知识,努力学习,加油哦.

 

posted @ 2008-04-17 12:50  Arishuang  阅读(406)  评论(0编辑  收藏  举报