分享

XML开发笔记 — 总结

 openwudi 2010-10-08

一、XML基础

1)XML(eXtensible Markup Language)可扩展标记语言,前身是SGML。

2)XML的特点:可扩展性、灵活性、自描述性、简洁性。

3)XML的实际应用:语音技术(voiceXML)、嵌入式开发(WAP/WML、Symbian、无线搜索)、图形技术(SVG)、远程教育(IMS、E-learning)、数据库(DATABASE)、安全(基于XML的签名、加密技术)、软件工程(ADML)。

4)XML规范及文档分类:

1、XML文档中的XML声明:
(1)version——版本声明
(2)encoding——编码声明
(3)standalone——独立性声明

2、XML文档中的处理指令和注释:
(1)处理指令:<?target-name data?>
(2)注释:<!–……….–>

3、XML文档中的元素和属性:
在层次结构的XML文档中,元素(ELEMENT)是最基本的组成单元,语法格式如下:
(1)开始标记 —— <element_name att1=”val1″ att2=”val2″>
(2)内容 —— ……content……
(3)结束标记 —— </element_name>
(4)element_name:元素名
(5)att1、att2:属性

一、元素和属性的命名规则:

O元素和属性的名称必须以字母、或者下划线_、或者冒号:开头。

O元素和属性的名称中除首个符号之外部分可以是字母、数字、横线-、下划线、点号.冒号的任意组合。

O元素名称大小写敏感。

O元素和属性名称长度没有限制。

二、空元素:

空元素可以包含属性

<details></details>

<details/>

三、子元素和属性的选择使用:

元素内容中的子元素和属性都可以用来刻画该元素某个方面的特征。

<book author=”tom”>……</book>

<book><author>tom</author></book>

四、XML文档中的文本内容和CDATA段

XML1.0中的五种预定于实体

字符                 预定义实体

<                <

>                >

&                &

‘                '

“               "

CDATA段使用格式:<![CDATA[........................]]>

五、XML文档的良性结构

1、开始标记必须与结束标记相对应

2、标记是大小写敏感的

3、标记必须正确嵌套

4、属性值必须使用引号括起来

5、有且只有一个根元素

5)命名空间

XML中命名空间的声明和使用

1、命名空间的声明

<myns:element xmlns:myns=”http://”>

……

</myns:element>

myns:element表示element元素属于myns这个命名空间

xmlns:myns=”http://”是命名空间的声明,表示命名空间全称为字符串”http://”

2、命名空间的使用

任何命名空间只能够在其作用域内进行使用,在同一个命名空间里,所有元素名和属性名都必须唯一。

3、缺省命名空间的使用

<?xml version=”1.0 encoding=”UTF-8″?>

<company xmlns=”MC”>

<company-info>

<name>Software DAN</name>

<ns1:division xmlns:ns1=”tom”>

<ns1:name>Development</ns1:name>

</ns1:division>

</company-info>

</company>

6)Uniode简介

OUTF-8编码

使用单字节编码,采用变长编码方式,比固定的双字节方式节省空间。

OUTF-16编码

使用双字节来对一个字符编码,可以使用变长的方式支持4个字节的字符,类似UTF-8处理2字            节编码。

二、文档类型定义DTD

实际上,它是一个面向SGML语言的规范。DTD是一种保证XML文档格式正确的有效方法。

1)DTD基本语法

1、内部DTD规则

2、外部DTD文件

3、元素及其内容模型的声明

【1】空元素:不包含子元素或者文本

【2】包含任意内容的元素

【3】只包含文本内容的元素

【4】只包含子元素的元素

内容模型中各个符号的含义

,——用于分隔序列的每一项,必须按照顺序出现

|   ——表示可从前后参数中任选一项

() ——表示括号内容为一个整体

  ——出现一次或者不出现

+  ——出现一次或者多次

*   ——出现零次或者多次

4、元素属性的声明

ATTLIST中的属性类型:CDATA、(value1|value2|…)、NMTOKEN、NMTOKENS、ID、IDRE            F、IDREFS、ENTITY、ENTITYS、NOTATION

ATTLIST中的属性描述:value、#REQUIRED、#IMPLIED、#FIXED value

5、实体的分类和声明

实际上,实体就是内容的占位符,只需要声明一次,就可在文档多次使用。

【1】参数实体

【2】一般实体

三、XML Schema

由于XML Schema在很多方面都有很大的作用,大有取代DTD的趋势,所以在此写了一些学习笔记。

XSDL(XML Schema定义语言)由元素、属性、命名空间和XML文档种的其他节点构成的。

一、XSD中的元素
XSD文档至少要包含:schema根元素和XML模式命名空间的定义、元素定义。
1、schema根元素
语法如下:
<xsd:schema xmlns:xsd=“http://www./2001/XMLSchema”>

</xsd:schema>
在XSD中必须定义一个且只能定义一个schema根元素。根元素中包括模式的约束、XML模式命名空间的定义,其他命名空间的定义、版本信息、语言信息和其他一些属性。

2、元素
语法如下:
<xsd:element name=”user” type=”xsd:string” />

XSD中的元素是利用element标识符来声明的。其中name属性是元素的名字,type属性是元素值的类型,在这里可以是XML Schema中内置的数据类型或其他类型。

例子:
<xsd:schema xmlns:xsd=“http://www./2001/XMLSchema”>
<xsd:element name=”user” type=”xsd:string” />
</xsd:schema>
以上文档对应的有效XML文档如下:
<?xml version=”1.0”?>
<user>string</user>
在 元素的定义中还有2个属性:minOccurs和maxOccurs。其中minOccurs定义了该元素在父元素中出现的最少次数(默认为1,值为大于 等于0的整数),maxOccurs定义了该元素在父元素中出现的最多次数(默认为1,值为大于等于0的整数)。在maxOccurs中可以把值设置为 unbounded,表示对元素出现的最多次数没有限制。

例子:
<xsd:schema xmlns:xsd=http://www./2001/XMLSchema>
<xsd:element name=”user” type=”xsd:string” minOccurs=”0” maxOccurs=”unbounded” />
</xsd:schema>
表示为元素user的类型为string,出现的次数最少为0(也就是可选),最多不限制。

3、引用元素和替代
语法如下:
<xsd:schema xmlns:xsd=”http://www./2001/XMLSchema”>
<xsd:element name=”user” type=”xsd:string” />
<xsd:element name=”name”>
<xsd:complexType>
<xsd:sequence>
<xsd:element ref=”user” />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>

引用是利用element标记符的ref属性实现的。主要适用于避免在文档中多次定义同一个元素,应当将经常使用的元素定义为根元素的子元素,以便在文档的任何地方引用它。

在这里还可以为某个定义的元素起一个别名(偶的理解^o^),方法如下:

<xsd:schema xmlns:xsd=”http://www./2001/XMLSchema”>
<xsd:element name=”yonghu” type=”xsd:string” substitutionGroup=”user” />
<xsd:element name=”user” type=”xsd:string” />
<xsd:element name=”name”>
<xsd:complexType>
<xsd:sequence>
<xsd:element ref=”user” />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>

以上文档对应的有效XML文档如下:

<?xml version=”1.0”?>
<name>
<user>string</user>
</name>
或者:
<?xml version=”1.0”?>
<name>
<yonghu>string</yonghu>
</name>

主要是利用element标识符中的属性substitutionGroup实现的。

4、设置默认值和固定值

语法如下:

<xsd:element name=”city” type=”xsd:string” default=”xian” />

<xsd:element name=”country” type=”xsd:string” fixed=”china” />

通过default属性的设置,可以在XML文档中没有对city元素定义时赋予默认值。而使用fixed属性,可以给元素country设定一个固定的值china,并且不允许改变!

5、利用组合器控制结构

sequence组合器,定义了一列元素必须按照模式中指定的顺序显示(如果是可选的,也可以不显示)。语法如下:

<xsd:schema xmlns:xsd=”http://www./2001/XMLSchema”>

<xsd:element name=”name”>

<xsd:complexType>

<xsd:sequence>

<xsd:element name=”first” type=”xsd:string” />

<xsd:element name=”middle” type=”xsd:string” />

<xsd:element name=”last” type=”xsd:string” />

</xsd:sequence>

</xsd:complexType>

</xsd:element>

</xsd:schema>

all组合器,允许所定义的元素可以按照任意顺序显示,all元素的子元素在默认情况下是必须的,而且每次最多显示一次。语法如下:

<xsd:schema xmlns:xsd=”http://www./2001/XMLSchema”>

<xsd:element name=”name”>

<xsd:complexType>

<xsd:all minOccurs=”0”>

<xsd:element name=”first” type=”xsd:string” />

<xsd:element name=”middle” type=”xsd:string” />

<xsd:element name=”last” type=”xsd:string” />

</xsd:all>

</xsd:complexType>

</xsd:element>

</xsd:schema>

choice组合器,允许指定多组声明中的一个,用于互斥情况。语法如下:

<xsd:schema xmlns:xsd=”http://www./2001/XMLSchema”>

<xsd:element name=”name”>

<xsd:complexType>

<xsd:choice>

<xsd:element name=”first” type=”xsd:string” />

<xsd:element name=”middle” type=”xsd:string” />

<xsd:element name=”last” type=”xsd:string” />

</xsd:choice>

</xsd:complexType>

</xsd:element>

</xsd:schema>

二、定义属性

在XML Schema文档中可以按照定义元素的方法定义属性,但受限制的程度较高。它们只能是简单类型,只能包含文本,且没有子属性。可以应用在attribute元素定义中的属性如下:

default 初始默认值

fixed 不能修改和覆盖的属性固定值

name 属性的名称

ref 对前一个属性定义的引用

type 该属性的XSD类型或者简单类型

use 如何使用属性

form 确定attributeFormDefault的本地值

id 模式文档中属性唯一的ID

Default、 fixed、name、ref和type属性与在element标记中定义的对应属性相同,但type只能是简单类型。Use属性的值可以 是:optional(属性不是必须的,此为默认属性)、prohibited或者required(属性是强制的)。

1、创建属性

语法如下:

<xsd:attribute name=”age” type=”xsd:integer” />

该语句定义了一个名为age的属性,它的值必须是一个整数。把它添加到模式中时,它必须时schema元素、complexType元素或者attributeGroup元素的子元素。

例子:

<xsd:schema xmlns:xsd=”http://www./2001/XMLSchema”>

<xsd:element name=”name”>

<xsd:complexType>

<xsd:sequence>

<xsd:element name=”first” type=”xsd:string” />

</xsd:sequence>

<xsd:attribute name=”age” type=”xsd:integer” use=”optional” />

</xsd:complexType>

</xsd:element>

</xsd:schema>

以上文档对应有效的XML文档如下:

<?xml version=”1.0”?>

<name age=”27”>

<first>string</first>

</name>

如上所示,要把属性附加在元素上,属性应该在complexType定义中的组合器之后定义或引用。

三、XML Schema数据类型

XML Schema提供了一组丰富的内置数据类型,用于定义元素中允许的类型。下面将介绍一些完全符合C#标准的通用类型。

1、基本数据类型

基本数据类型是在XML Schema中使用的每种数据类型的最基本构成块。可以根据这些类型构造自定义的类型。这些类型包括:

boolean 可以是1(true)或者0(false)。

dateTime 表示时间的部分可选,格式:CCYY-MM-DDThh:mm:ss

例如:2005-3-18T14:48:12

decimal 表示任意精度的十进制数字。

string 字符数据。

int 表示从-2,147,483,648到2,147,483,648之间一个整数。

nonNegativeInteger 表示大于或者等于0的一个整数。

nonPositiveInteger 表示小于或者等于0的一个整数。

short 表示从-32768到32767之间的一个整数。

例如:

<xsd:schema xmlns:xsd=http://www./2001/XMLSchema>

<xsd:element name=”ContactDetails”>

<xsd:complexType>

<xsd:sequence>

<xsd:element ref=”name” />

<xsd:element name=”rate” type=”xsd:decimal” />

</xsd:sequence>

<xsd:attribute name=”lastUpdated” type=”xsd:dateTime” />

</xsd:complexType>

</xsd:element>

<xsd:element name=”name”>

<xsd:complexType>

<xsd:sequence>

<xsd:element name=”first” type=”xsd:string” />

<xsd:element name=”middle” type=”xsd:string” />

<xsd:element name=”last” type=”xsd:string” />

</xsd:sequence>

<xsd:attribute name=”local” type=”xsd:boolean” />

</xsd:complexType>

</xsd:element>

</xsd:schema>

以上文档对应有效的XML文档如下:

<?xml version=”1.0”?>

<ContactDetails lastUpdated=” 2005-3-18T14:48:12”>

<name local=”true”>

<first>santld</first>

<middle/>

<last>wang</last>

</name>

<rate>10.27</rate>

</ContactDetails>

2、简单类型

虽然从内置数据类型中得到了许多的功能,但是在许多情况下,只有数据类型来限制数据的值是远远不够的。这里在学习简单类型之前,先看看关于约束。

约束方面

enumeration 用空格分开的一组指定的数值。它把数据类型约束为指定的值。

fractionDigit 指定小数点后的最大位数。

length 长度单位。

minExclusive 下限值,所有的值都必须大于该值。

maxExclusive 上限值,所有的值都应该小于该值。

minLength 长度单位的最小个数。

maxLength 长度单位的最大数。

minInclusive 最小值,所有的值都应该大于或者等于该值。

maxInclusive 最大值,所有的值都应该小于或者等于该值。

pattern 数据类型的值必须匹配的指定模式,pattern值必须是一个正则表达式。

totalDigits 指定小数最大位数的值。

whiteSpace 其值为:preserve(值中的空格不能改变),replace(所有的制表

符、换行符和回车符都用空格代替),collapse(执行replace,删

除相邻的、结尾处和开头处的空格)。

要应用上述的约束,就要利用元素restriction。这个元素中有2个属性:id属性是模式文档中restriction元素的唯一标识符,base属性设置为一个内置的XSD数据类型或者现有的简单类型定义,他是一种被限制的类型。

例如:

<xsd:restriction base=”xsd:string”>

<xsd:minLength value=”4” />

<xsd:maxLength value=”10” />

</xsd:restriction>

如上,将字符串最小长度限定为4个字符,将最大长度限定为10个字符。

<xsd:restriction base=”xsd:int”>

<xsd:minInclusive value=”1” />

<xsd:maxInclusive value=”100” />

</xsd:restriction>

如上,将一个整数的取值范围设置为1到100之间。

<xsd:restriction base=”xsd:string”>

<xsd:enumeration value=”FistValue” />

<xsd:enumeration value=”SecondValue” />

<xsd:enumeration value=”ThirdValue” />

</xsd:restriction>

如上,字符串只能为枚举出的三种值。

简单类型

简单类型是对一个节点的可能值进一步限制的自定义数据类型。创建简单类型需要利用simpleType元素,其定义如下:

<simpleType id=”ID” name=”NCName” final=”(#all|(list|union|restriction))” />

id属性应唯一的标明文档内的simpleType元素,name不能使用冒号字符。simpleType不能包含元素,也不能有属性,根据在simpleType中定义的规则,它基本上是一个值,或者是一个值的集合。

例如:

<xsd:simpleType name=”personsName”>

<xsd:restriction base=”xsd:string”>

<xsd:minLength value=”4” />

<xsd:maxLength value=”8” />

</xsd:restriction>

</xsd:simpleType>

<xsd:element name=”first” type=”personsName” />

以上文档对应有效的XML文档如下:

<first>Santld</first>

以下就是无效的XML文档:

<first>SS</first> 或者 <first>Santld wang</first>

再举个例子:

<xsd:simpleType name=”personsTitle”>

<xsd:restriction base=”xsd:string”>

<xsd:enumeration value=”Mr.” />

<xsd:enumeration value=”Mrs.” />

<xsd:enumeration value=”Miss.” />

</xsd:restriction>

</xsd:simpleType>

<xsd:element name=”title” type=”personsTitle” />

上面定义的类型personsTitle是一个字符串类型,但它的值只能是Mr.、Mrs.或者Miss.其中的一个。

复杂类型

复杂类型的定义必须使用complexType元素,在这里可以包含属性和元素。在复杂类型的使用中,主要是complexType和simpleType配合使用。格式如下:

<xsd:complexType name=”name” />

例如:

<xsd:element name=”name” type=”FullName” />

<xsd:complexType name=”FullName”>

<xsd:sequence>

<xsd:element name=”first” type=”PersonsFirstname” minOccurs=”0″ maxOccurs=”1″

default=”John” />

<xsd:element name=”middle” type=”xsd:string” minOccurs=”0″

maxOccurs=”unbounded” nillable=”true” />

<xsd:element name=”last” type=”xsd:string” minOccurs=”1″ maxOccurs=”1″

default=”Doe” />

</xsd:sequence>

<xsd:attribute name=”title” type=”PersonsTitle” default=”Mr.” />

</xsd:complexType>
<xsd:simpleType name=”PersonsFirstname”>

<xsd:restriction base=”xsd:string”>

<xsd:minLength value=”4″ />

<xsd:maxLength value=”10″ />

</xsd:restriction>

</xsd:simpleType>

<xsd:simpleType name=”PersonsTitle”>

<xsd:restriction base=”xsd:string”>

<xsd:enumeration value=”Mr.” />

<xsd:enumeration value=”Mrs.” />

<xsd:enumeration value=”Miss.” />

</xsd:restriction>

</xsd:simpleType>

如上就实现了一个复杂类型,该例子实现了一个复杂类型FullName,其中包含了两个简单类型PersonsFirstname和PersonsTitle。

分组和属性

在为定义XML文档而创建的一些更为复杂的定义中,会有一些元素集、属性集的组合,这是我们就使用了分组的概念。分组定义中使用的是group元素。

例如:

<xsd:group name=”CityChoice”>

<xsd:choice>

<xsd:element name=”Beijing” type=”xsd:string” />

<xsd:element name=”Shanghai” type=”xsd:string” />

<xsd:element name=”Xian” type=”xsd:string” />

</xsd:choice>

</xsd:group>
<xsd:element name=”City”>

<xsd”group ref=”CityChoice” minOccurs=”1” maxOccurs=”1” />

</xsd:element>

对属性的分组,应该使用attributeGroup元素,例如:

<xsd:attributeGroup name=”contactAttribs”>

<xsd:attribute name=”city” type=”xsd:string” />

<xsd:attribute name=”country” type=”xsd:string” />

<xsd:attribute name=”age” type=”xsd:string” />

</xsd:attributeGroup>

<xsd:element name=”contact”>

<xsd:complexType>

<xsd:attributeGroup ref=”contactAttribs” />

</xsd:complexType>

</xsd:element>

以上文档对应有效的XML文档如下:

<contact city=”Beijing” country=”China” age=”25” />

内容模型

内容模型可以对在XML文档内使用的元素、属性和类型进行限制,确定用户可以在XML实例的哪些等级添加自己的元素和属性。

any

当在XML中声明元素时any是默认的内容模型,该模型可以包含文本、元素和空格。如果允许添加元素的内容,且无需屋里修改模式文件,就可以使用该模型。

例如:

<xsd:xchema xmlns:xsd=”http://www./2001/XMLSchema”>

<xsd:element name=”name”>

<xsd:complexType>

<xsd:sequence>

<xsd:element name=”first” type=”xsd:string” />

<xsd:element name=”middle” type=”OtherNames” />

<xsd:element name=”last” type=”xsd:string” />

</xsd:sequence>

</xsd:complexType>

</xsd:element>

<xsd:complexType name=”OtherNames”>

<xsd:sequence>

<xsd:any namespace=”##any” processContents=”lax” minOccurs=”0”

maxOccurs=”unbounded” />

</xsd:sequence>

</xsd:complexType>

</xsd:schema>

例子中的xsd:any元素说明该类型允许添加内容。namespace属性允许的值为:

##any(元素可以来自任何命名空间)

##other(元素可以来自除了该元素的父元素所在的目标命名空间之外的命名空间)

##local(元素不受命名空间的限制)

##targetNamespace(元素来自父元素的目标命名空间)

processContents属性说明对这里所创建的元素进行验证时所执行的操作,取值有如下3种:

strict(标明XML处理器必须获得和那些命名空间相关联的模式,并验证元素和属性)

lax(与strict相似,只是如果处理器找不到模式文档,也不会出现错误)

skip(不利用模式文档验证XML文档)

上述模式的一个有效实例如下:

<?xml version=”1.0”?>

<name>

<first>santld</first>

<middle>

<nameInChina>San</nameInChina>

</middle>

<last>wang</last>

</name>

empty

empty元素禁止把文本或者元素作为一个声明为空的元素的子元素,如果要保证该元素不包括子元素、文本甚至空格,就可以使用它。在XSD中时利用xsd:anyType类型来限定它的,这样就意味元素只能包含属性,例如:

<xsd:schema xmlns:xsd=”http://www./2001/XMLSchema”>

<xsd:element name=”contact”>

<xsd:complexType>

<xsd:complexContent>

<xsd:restriction base=”xsd:anyType”>

<xsd:attribute name=”age” type=”xsd:integer” />

</xsd:restriction>

</xsd:complexContent>

</xsd:complexType>

</xsd:element>

</xsd:schema>

以上就是一个复杂类型,只允许有一个age属性。在例子里complexContent元素可以表示complexType的内容要进行扩充或者限制,在这里,我们对其内容进行限制,因此使用了restriction元素,如果扩成则使用exension元素。

element(前边已经了解过了)

mixed

最后一个内容模型就是mixed,它包含文本、内容和属性。在complexType元素上把mixed属性的值设为true,就一个声明一个mixed内容模型了。例如:

<xsd:schema xmlns:xsd=”http://www./2001/XMLSchema”>

<xsd:element name=”contact”>

<xsd:complexType mixed=”true”>

<xsd:sequence>

<xsd:element name=”first” type=”xsd:string” />

</xsd:sequence>

<xsd:complexType>

</xsd:element>

</xsd:schema>

上述模式的一个有效实例如下:

<?xml version=”1.0”?>

<contact>My first name is<first>Santld</first>.</contact>
在例子中contact元素就包含了文本和元素first。

四、XQuery

XQuery 对大小写敏感,XQuery 的元素、属性以及变量必须是合法的 XML 名称。

XQuery 的基础语法规则:

一些基本的语法规则:

  • XQuery 对大小写敏感
  • XQuery 的元素、属性以及变量必须是合法的 XML 名称。
  • XQuery 字符串值可使用单引号或双引号。
  • XQuery 变量由 “$” 并跟随一个名称来进行定义,举例,$bookstore

XQuery 条件表达式

“If-Then-Else” 可以在 XQuery 中使用。

请看下面的例子:

for $x in doc("books.xml")/bookstore/book
return if ($x/@category="CHILDREN")
then <child>{data($x/title)}</child>
else <adult>{data($x/title)}</adult>

请注意 “If-Then-Else” 的语法:if 表达式后的圆括号是必需的。else 也是必需的,不过仅仅写 “else ()” 也是可以的。

上面的例子的结果:

<adult>Everyday Italian</adult>
<child>Harry Potter</child>
<adult>Learning XML</adult>
<adult>XQuery Kick Start</adult>

XQuery 比较

在 XQuery 中,有两种方法来比较值。

  1. 通用比较:=, !=, <, <=, >, >=
  2. 值的比较:eq、ne、lt、le、gt、ge

这两种比较方法的差异如下:

请看下面的 XQuery 表达式:

$bookstore//book/@q > 10

如果 q 属性的值大于 10,上面的表达式的返回值为 true。

$bookstore//book/@q gt 10

如果仅返回一个 q,且它的值大于 10,那么表达式返回 true。如果不止一个 q 被返回,则会发生错误。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多