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架构
文档类型定义DTD(Document 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>
<内存>
<硬盘>
</笔记本电脑>
</产品目录>
如果允许一个元素的各子元素以任意顺序出现,甚至有的不出现,可以采用下列方法定义:
<!ELEMENT 元素名 ANY>
<!ELEMENT 子元素1 元素内容描述>
<!ELEMENT 子元素2 元素内容描述>
……
2、 定义重复元素
重复出现的符号见表-1。
[例6:]
1)<!ELEMENT note (message)> 表示子元素message只能在note中出现一次
2)<!ELEMENT note (message+)> 表示子元素message在note中至少出现一次
3)<!ELEMENT note (message*)> 表示子元素message在note中至少0次或多次(任意次)
4)<!ELEMENT note (message?)> 表示子元素message在note中至少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=”至少出现次数(当maxOccurs和minOccurs都没定义时,该元素只能出现一次)”
fixed=”固定值(不能与default一起定义)”
……>
在XSD中,元素的内容由其定义的element的type属性来定义。元素类型包括内置类型、简单类型和复合类型。
1、 内置类型
内置类型指定的数据可以作为内容出现在XML文档中。内置类型类似大多数编程语言中的数据类型。有19种基本的类型和25种派生出的类型,如:string,integer,decimal等。使用内置类型来定义元素很简单,只要指定元素名和类型名就可以了。
[练习:]创建可以取整数的内置类型元素名称为”订单号”。
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>是复合类型定义的组合器,包括sequence,choice和all,它们用来定义子元素出现形式的约束条件。Sequence表示必须按定义的顺序出现的XML文档示例中;choice表示只允许其中的一个子元素出现在XML文档示例中;all表示所有子元素同时出现一次,或则不出现,而且他们可以按任意的顺序出现在XML文档的示例中。
四、 定义属性
属性定义方法:
<attribute name=”属性名”
type=”类型名”(同元素定义一样)
default=”缺省值”
fixed=”固定值(不能与default一起定义)”
……>
以上是自己在之前学过的XML基础知识,努力学习,加油哦.