XML的核心技术

 

1、确认技术 XML为描述结构良好的文档提供了一整套灵活的语法。正因为它的这种灵活性,我们需要一些方法来确认某一种特殊类别的XML文档都有所预计的一种格式。例如,以下就是一个“结构良好的”XML文档。例如,以下就是一个“结构良好的”XML文档。

   <?Xml version="1.0"?>

   <cocacola>

   <cocacola lowfat="dreamon"/>

   <cocacola lowfat="maybe">

   <name>Drink</name>

   <description>Greasyandgood.</description>

   <price>2.99</price>

   <price>3.99</price>

   </cocacola>

   </cocacola>

   然而,这个文档有一些应用级的问题。注意到了吗,文档中一个cocacola元素出现在了另一个cocacola元素里面。请别担心,对于这个例子来说这个XML结构没有任何的错误。另外,请注意在里层的cocacola元素中有多个price元素。哪一个price是正确的呢?系统有可能会显示出这里一个BUG。在这种情况下,一个标准的确认XML文档的机制将是十分有用的。

  ·Schma

   一个Schema通常是一组为了描述一类给定的XML文档而预先定好的规则。它定义了可以在指定XML文档中出现的各个元素以及和某个元素相关的若干属性。它同时定义了关于XML文档的结构化信息,比如哪几个元素是其他元素的子元素,子元素出现的顺序和他们为数量。它还可定义一个元素是否为空,能否包含文本或者属性是否有默认值。

·文档类型定义(Document Type Definitions

DTD语言是为了定义SGML文档的确认规则而专门开发的。因为XMLSGML的一个子集,所以DTD也可以用来定义XML的确定规则。与XML Schema不同,一个XML处理器可以在运行时用DTD来确定一个XML的合法性。

DTD的语法有时可能会有一些晦涩难懂。DTD使用不同的语法元素,诸如惊叹号、圆括号、星号、尖括号等,来定义在一个XML文档中哪能些元素是必备的,哪些是可选的以及可以出现的元素数量等。DTD同时还定义了元素之间的关系和属性与不同元素之间的关系。

下面就是前面列出的cocacola.xmlDTDcocacola.dtd

<! ELEMENT cocacola(cocacola)*>

<! ELEMENT cocacola(name,description,price)>

<! ELEMENT cocacolalowfatCDATA#IMPLIED>

<! ELEMENT name(#PCDATA)>

<! ELEMENT description(#PCDATA)>

<! ELEMENT price(#PCDATA)>

这篇文档指出,cocacola元素包含多个cocacola元素。同时,每一个cocacola元素必须包含一个lowfat属性和3个子元素,所有的类型都是#PCData(parsedcharacterdata)。遵从这篇DTD的文档都必须加入下面一行代码:

<! DOCTYPE cocacola SYSTEM = “cocacola.dtd”>

这句声明告诉分析器不论DTD中的schema是什么都认为XML文档的内容是合法的。

尽管MSXML2.0支持DTD,但是你还是会发现使用它们是很费力的。它非常复杂并且难于掌握与使用。请注意,DTD语法并不是合法的XML。正因为如此,XML的处理器除了XML语法,还要支持用来描述SchemaDTD语法。设想一下,假如我们用XML来描述Schema,那么开发者,特别是XML工具的提供者,所承担XML文档检验工作将会容易的多。

·XML数据

XML-Data是一种XML Schema语言。在微软的定义中,XML-Data Schema通常是指XML Schema ,而不是DTD Schema。一个XML-Data Schema是一个具有良好结构的XML文档。XML-Data语言基于XML-Data DTD,后者指明所期望的Schema定义格式。因为XML-Data Schema是简单的XML文档,任何用于XML文档的工具都可以用来定义XML-Data Schema

<Schema name=”Untitled-schema” xmlns=”urn:schema-microsoft-com:xml-data” xmlns:dt=”urn:schema-microsoft-com:datatypes”>

<ElementType name=”cocacola” model=”closed” content=”eltonly” order=”seq”>

<AttributeType name=”lowfat” dt:type = “string” required=”no”/>

<attribute type=”lowfat”/>

<element type=”cocacola” minOccurs=”0” maxOccurs=”1”>

<element type=”name” minOccurs=”0” maxOccurs=”1”>

<element type=”description” minOccurs=”0” maxOccurs=”1”>

<element type=”price” minOccurs=”0” maxOccurs=”1”>

</element>

<element name=”description” model=”closed” content=”textonly” dt:type=”string”/>

<element name=”name” model=”closed” content=”textonly” dt:type=”string”/>

<element name=”prcice” model=”closed” content=”textonly” dt:type=”string”/>

</schema>

XML-Data Schema中定义元素和属性时,分别用到的是<ElementType><AttributeType>元素。它们提供了对元素和属性类型的定义。定义一个元素或是属性时用<element><attribute>标签。你可以通过定义minOccurs/maxOccurs来指定元素允许出现的数量。Schema XML结构还定义了元素在XML文档中允许出现的位置。

2、处理器(API)技术

我们在前面已经提过了,为了有效地使用XML,你必须通过编程来访问数据。我们将一个能访问XML文档同时又能提供对其内容和数据结构进行访问的软件模块称为一个XML处理器或是一个XML API

虽然开发者完全有自由去开发或使用自己的XML API,但从他们的利益出发,我还是建议他们使用行业标准的API。因为只有授受了行业标准的API,开发者写出的代码才可以无须修改便能在其他的环境中顺利执行。

目前有两种主要的API已经得到了广大开发者的广泛使用,即将成为未来的行业标准。它们分别是DOM(Document Object Model)SAX(Simple API for XML)

·DOM

文档对象模型是一种通过编程方式对XML文档中数据及结构进行访问的标准。W3C已经同意将其列为未来行业标准第一等级规范的推荐对象。

DOM是基于XML文档在内存中的树状结构。当一个XML文件被装入到处理器中时,内在中建立起一棵相应的树。DOM还定义了用来遍历一棵XML树和管理各个元素、值和属性的编程接口。

Figurel.XMLin-memoryrepresentation

MS XML2.0完全支持DOM并提供了一个易用的对象模型与内存中树进行交互。下面是一个简单的VB例子,它演示了如何用MS XML来遍历一颗树的所有子元素。

Set xmlDoc = CreatObject(“XMLML.DOMDocument”)

bSuccess=xmlDoc.load(“cocacola.xml”)

if buSuccess Then

   ForEach node in XmlDoc.documentElement.childNodes

     Val=node.text

   Next

End if

SAX

DOM标准的一个主要不足在于将整个XML文档装入内存所引起的巨大开销。当文件的数据量非常大时,这会给带来一些问题。当在内部网或因特网上传输如此巨大的XML文件时,可能等不及所有的文件传输结束就开始处理数据。很多XML的开发者已经意识到这一点,于是他们一起努力开始创立别一种新的标准。这就是SAX

·SAX

SAX是一种非常简单的XML API,它允许开发者使用事件驱动的XML解析。与DOM不同,SAX并不要求将整个XML文件一起装入内存。它的想法十分的简单,一旦XML处理器完成对XML元素的操作,它就立刻调用一个自定义一个事件处理器及时处理这个元素和相关数据。这样做虽然能极大地提高效率,但也会造成一定的问题。

3、转换技术

一旦开始使用标准的的DOM API来实现于XML数据的交互,便会发现,无论是从一个大型文档中取得一个特定的数据,还是将一个XML文档的某一部分转换为另一种格式的数据,都是十分单调乏味的。

举个例子说,假如想找到所有的lowfat cocacola price元素。为了用标准的DOM API来完成这一切,必须通过手工地书写代码遍历整颗树来找寻符合条件的元素。再看另一个例子,假如想将所用的cocacola元素和相关的数据转换为简单的HTML表格以供用户交互使用。使用标准的DOM API,就要手工遍历整颗树来获得HTML表格中所需的数据。

·XSLPatterns

一个模式就是一个字符串,通过它来选取XML树中的节点。这样的选取取决于模式所关联的当前节点。元素的名字是最简单的模式,这个模式选取了当前节点所有具有该名字的子节点。例如,cocacola模式选取了当前节点的所有cocacola了节点。

模式的语法非常完备。它允许标识某个指定元素在文档中所处的上下文,同时还提供了强大的筛选句法,使得可以标识出符合给定条件的节点。为了找出一个cocacola子节点。为了找出一个cocacola元素中的所有lowfat cocacola price元素,可以使用以下的模式字符串:

/cocacola/cocacola[@lowfat=”yes”]/price

当某个模式被应用于给定的节点时,它仅返回符合指定模式的节点列表。这大大简化了开发者的操作,不再需要遍历整颗树。

MS XML 2.0对模式语法的支持和Extensible Stylesheet Language(December 18th working Draft)中的定义是相同的。MS XML2.0中的IXMLDOMNode接口提供了两个方法,SelectNodesSelectSingleNode。这两个方法都以一个模式串为参数。例如:下面的一行代码将返回满足条件的所有price节点。

SetnodeList = rootNode.selectNodes(“cocacola[@lowfat=”yes”]/price”)

·XSL

XSL模式可以帮助我们标识一篇给定XML文档中的某些节点,但对这些节点的操作最终还是有赖于开发者来完成。XSL可以帮助我们简化完成通常XML任务的过程:将XML节点从一种格式转化为另一种格式。这种对格式转化的需求起源于WEB开发者需要将他们的XML数据转化为HTML数据以供用户浏览。

实际上,XSL所能做的远比以上描述多得多。XSL能够有效地定义从一种XML格式到另一种XML格式之间的转换,这极大地增强了互操作性。假如某个人向你的系统发送了一篇XML文档,而你的系统不认识它所采用的XML词汇,你只要进行一次简单的XSL转换就可以得到自己熟悉的词汇。正是由于XML这种简单的特点,开发者才不用为了描述某种类型的数据而采用通用的词汇。

一个XSL文件中包含了一系列定义转换规则的声明模板。每一个模板都明确定义了怎样将源文档中的指定节点转换为输出文档的节点的方法。你可以使用XSL模式来决定一个模板应用于一篇文档中的哪些部分。

4、链接技术

很多人都认为,HTML真正强劲的地方在于它的锚元素。

锚元素使开发者可以建立从一个HTML页面到另一个页面的链接,定义两个文档之间的关系。这给用户提供了一种从当前页面中获取更多相关数据的途径。同时,这也是用户在查询数据中所使用的典型方法。为了查找数据,用户浏览某一页面,同时在这篇该页面中可能会发现更符合要求的内容。

整个WEB就是基于这样一个在不同的数据文件之间建立关系的基石的。随着IT行业不断的向前发展,自然会想到用类似的机制来描述不同XML文档或是相同文档不同元素之间的联系。

·XLink

XML Linking1.0w3c所主导的,用来定义XML链接的语法。根据XLink1.0文档的要求,一个XML链接或XLink的描述信息所显示的是指定了资源或部分资源之间的关系。

<cocacola xml:link=”simple” HREF=”http://eacely.com/cocacola.asp”>

</cocacola>

·XPointer

在前面的讲述中已经讲到,XLink需要依靠不同的机制来标识想要链接的资源。W3c推出了另一种叫做XPointer的机制用于构造XML文档的内部结构。具体地说,它决定了一篇XML文档中的元素、字符串或其他部分是否具有某个具体的标识。

一个XPointer包括一系列描述位置的术语,它们中的任何一个都指定了一个特定的位置信息,通常这样的位置信息总是和前一个术语所指定的位置信息相关联。每一个位置术语都有一个关键字和若干变量,诸如实例的序列号、元素类或属性。

Child(2,cocacola)

指的是第二个类型为cocacola的元素。

5、其他XML相关的技术和词汇

·SMIL

SMIL是一种基于XML的表述多媒体演示的语言。SMIL允许将一组独立的多媒体对象整合为一个多媒体演示。

·VML

矢量标记语言用于定义矢量信息编码格式的一个XML应用,它和其他标记一起决定了信息以何种形式显示在屏幕上。VML对标记矢量图形信息的支持和HTML对标记文本信息的支持是一样的。

·XML片断

XML的规格支持由若干实体组成的逻辑文档。通常,查看、编辑一个或多个实体甚至于实体的某个部分比查看、编辑整篇文档来得更普通、更有意义。

·XHTML

XHTML是符合XML的新HTML文档中的又一个家族。XHTML文档被设计成可以和XML处理器协同工作。

posted on 2007-12-21 19:35  C#家园  阅读(364)  评论(0编辑  收藏  举报