设为首页
收藏本站
本站论坛
   
3
3
   
  文章列表      

第6课 使用XML Schema

什么是XML Schema

XML Schema是一个基于XML的语法或Schema规范,用来定义XML文档的标记方式。XML Schema是一个由Microsoft建议的Schema规范,它与文档类型定义(DTD)相比具有很大的优势,而DTD是最初用来定义XML模型的Schema规范。DTD存在很多缺点,包括使用非XML语法,不支持数据类型定义,不具有扩展性等。例如,DTD不允许把元素内容定义为另外一个元素,或字符串。想了解更多有关DTD的内容,可以参考W3C XML建议书。 XML Schema从几个方面改善了DTD,包括使用XML语法,支持数据类型定义和名域。例如,XML Schema允许你把一个元素说明为一个integer, float,Boolean, URL等类型。在Internet Explorer 5中的XML解析器可以解析使用DTD或XML SchemaXML文档。如何建立XML Schema
请在下面的XML文档中找一找每个节点的Schema声明。
<class XMLns="x-Schema:classSchema.XML">
      <student studentID="13429">
         <name>Jane Smith</name>
         <GPA>3.8</GPA>
     </student>
</class>
你会注意到在上面文档中默认的名域是“x-Schema:classSchema.XML”。这告诉解析器根据URL(“classSchema.XML”)上的Schema(x-Schema)来解析整个文档。下面是上面那个文档的完整的Schema。注意Schema的根元素中的名域声明。第一个(XML ns=”urn:Schemas-microsoft-com:XML-data”)表明这个XML文档是一个XML Schema。第二个(XMLns:dt=”urn:Schemas-microsoft-com:datatypes”)允许Schema处理者在ElementType和AttributeTye声明中的type属性前加dt前缀来说明元素的类型和内容的特征。

<Schema  XMLns="urn:Schemas-microsoft-com:XML-data" XMLns:dt="urn:Schemas-mi
crosoft-com:datatypes">
     <AttributeType name='studentID' dt:type='string' required='yes'/>
     <ElementType name='name' content='textOnly'>
     <ElementType name='GPA' content='textOnly' dt:type='float'/>
     <ElementType name='student' content='mixed'>
         <attribute type='studentID'/>
         <element type='name'/>
         <element type='GPA'/>
     </ElementType>
     <ElementType name='class' content='eltOnly'>
         <element type='student'/>
     </ElementType>
</Schema>
用来定义元素和属性的声明元素如下所示:
元    素          说    明
ElementType 把类型和条件赋给一个元素,可以包含子元素
AttributeType 把类型和条件赋给一个属性
attribute 声明以前定义过的属性类型可以出现在名为ElementType的元素的作用域中
element 声明以前定义过的元素类型可以出现在名为ElementType的元素的作用域中

 
Schema的内容以最深层的元素的“AttributeType”和“ElementType”声明开头。
<AttributeType name='studentID' dt:type='string' required='yes'/>
<ElementType name='name' content='textOnly'>
<ElementType name='GPA' content='textOnly' dt:type='float'/>
ElementType声明后接着就是它的属性和子元素,如果一个元素有属性或子元素,必须把这种方法包含在它的ElementType声明中,或者是必须在它们自己的 ElementType 或AttributeType声明中进行前导声明。
<ElementType name='student' content='mixed'>
     <attribute type='studentID'/>
     <element type='name'/>
     <element type='GPA'/>
</ElementType>
不同于DTDs,XML Schema允许有一个开放的内容模式,你可以进行定义数据类型、使用默认值等等操作而不必限定内容。
在下面的Schema中,<GPA> 元素的类型被定义并有一个默认值,但在 <student> 元素中没有其他节点被声明。
<Schema XMLns="urn:Schemas-microsoft-com:XML-data" XMLns:dt="urn:Schemas-micosoft-com:datatypes">
      <AttributeType name="scale" default="4.0"/>
      <ElementType name="GPA" content="textOnly" dt:type="float">
         <attribute type="scale"/>
      </ElementType>
      <AttributeType name="studentID"/>
      <ElementType name="student" content="eltOnly" model="open" order="many
">
         <attribute type="studentID"/>
         <element type="GPA"/>
      </ElementType>
</Schema>
上面的Schema允许你只验证你所关心的区域,这使你对文档的验证级别有更多的控制,并允许你使用Schema提供的一些特性而不必严格确认。 尝试一下!
试着处理一下下面的XML文档的Schema
<order>
  <customer>
    <name>Fidelma McGinn</name>
    <phone_number>425-655-3393</phone_number>
  </customer>
  <item>
    <number>5523918</number>
    <description>shovel</description>
    <price>39.99<price>
  </item>
  <date_of_purchase>1998-10-23</date_of_purchase>
  <date_of_delivery>1998-11-03</date_of_delivery>
</order>
如果你处理完Schema,在XML Validator中运行 .
下载MSDN Online的区域中提供了一套 XML sample files, 包括一个有相关SchemaXML文档。下载这些示例程序可以与XML文档和Schema一起运行。如果你想要根据一个Schema来测试XML的有效性,可以从XML Validator 处下载文档或查看Mime Type Viewer中的XML文件。
一些说明:
ElementType和 AttributeType 声明必须放在attribute和element内容声明之前。例如,在上面的Schema中,<GPA>元素的ElementType声明必须放在<student>元素的ElementType声明之前。 
order属性的默认值是建立在content属性的值上的。当content值为“eltOnly”时,order默认值是seq。当content值为“mixed”时,order默认值是“many”。see 如果想了解有关这些缺省值的信息,可以查看 XML Schema Reference。

第7课:在XML文档中使用数据类型

什么是XML文档中的数据类型?
XML文档中的数据类型是赋给实例中一个元素的类型,可以使用dt:dt属性来实现,也可以通过一个XML Schema,一个XML文档的正式定义来实现。此外,数据类型可以声明为元素,XML解析器使用数据类型信息来验证文档的有效性。
以前,XML元素的值局限于一个单一的类型String,因此想要处理XML文档的开发者需要花费大量的时间来把应用程序中的所有值都转换为一种类型。输入数据时解析器将会注意到数据类型的转换。此外,因为这些值都赋予一个特定的数据类型,所以对这些值的转换遵循要数据类型的规范,这就提供了一种验证用户输入有效性的方法。除了有一个String的值,每一个XML元素也可以有一个类型定义的值,例如下面的XML元素:
<date>1970-09-30</date>
 
如何对XML元素值进行数据类型定义?

看一看下面的XML文档:
<?XML version="1.0"?>
<weather XMLns="x-Schema:weatherSchema.XML">
  <date>1970-09-30</date>
  <degrees>67.5</degrees>
</weather>
其中"weatherSchema.XML"是下面的文件。
<Schema XMLns="urn:Schemas-microsoft-com:XML-data" XMLns:dt="urn:Schemas-mic
rosoft-com:datatypes">
  <ElementType name="date" content="textOnly" dt:type="date"/>
  <ElementType name="degrees" content="textOnly" dt:type="float"/>
  <ElementType name="weather" content="eltOnly">
    <element type="date"/>
    <element type="degrees"/>
  </ElementType>
</Schema>
上面的Schema是一个把数据类型赋给前面的XML文档的正式定义。属性XMLns是声明名域的XML关键字,声明'XMLns:dt="urn:Schemas-microsoft-com:datatypes"'把dt赋给名域urn:Schemas-microsoft-com:datatypes.",任何定义为dt的类型都属于名域"urn:Schemas-microsoft-com:datatypes.". Schema 和数据类型名域要在XML Schema的开始进行声明,这样dt词头可以用来指示数据类型定义中使用那种 类型的属性。
<Schema XMLns="urn:Schemas-microsoft-com:XML-data" XMLns:dt="urn:Schemas-mic
rosoft-com:datatypes">
  <ElementType name="NUMBER" content="textOnly" dt:type="number"/>

XML文档中的元素进行类型定义

元素可以通过元素实例的 dt 属性进行类型定义,而要这样做需要在XML文档的开始声明数据类型名域。

<NUMBERS XMLns:dt="urn:Schemas-microsoft-com:datatypes">
  <NUMBER dt:dt="number">44533</NUMBER>
</NUMBERS>
dt词头现在可以作为dt的属性把数据类型赋给元素的实例。在XML文档中把数据类型作为元素使用除了在元素的实例或Schema中声明数据类型外,数据类型也可以作为元素使用,比较下面的例子,第一个例子在元素的实例中声明数据类型:
<shoes XMLns:dt="urn:Schemas-microsoft-com:datatypes" id="f1121" sizes="mens"/>
<sizes id="mens">
  <size dt:dt="int">8</size>
  <size dt:dt="int">10</size>
  <size dt:dt="int">12</size>
</sizes>
第二个例子把类型声明为元素:
<shoes XMLns:dt="urn:Schemas-microsoft-com:datatypes" id="f1121" sizes="array1"/>  
<array id="array1">
  <dt:int>8</dt:int>
  <dt:int>10</dt:int>
  <dt:int>12</dt:int>
</array>
而通过Schema是不可能对这种元素进行类型定义的。
XML Data Types Reference中,有一个可以在 XML文档中使用的数据类型的列表。

第8课:访问经过类型定义的XML

什么是经过类型定义的XML值?

经过类型定义的XML值是指在XML Schema中被指定数据类型的元素值。XML解析器使用Schema来确认文档。XML Schema信息可以放在Schema文件中,也可以放在本身的XML文档中。

如何访问经过类型定义的XML值?

可以通过XML对象模型访问经过类型定义的数据。就好象你能通过调用元素节点的nodeValue属性找到元素值一样,你可以调用元素本身的nodeTypedvalue属性找到经过类型定义的元素值。
例如,考虑一下下面的XML文档:
<?XML version="1.0"?>
<weather XMLns="x-Schema:weatherSchema.XML">
      <date>1970-09-30</date>
      <degrees>67.5</degrees>  
</weather>
其中“weatherSchema.XML”是下面这个文件:
<Schema XMLns="urn:Schemas-microsoft-com:XML-data"XMLns:dt="urn:Schemas-micr
osoft-com:datatypes">
       <ElementType name="date" content="textOnly" dt:type="date"/>
       <ElementType name="degrees" content="textOnly" dt:type="float"/>
       <ElementType name="weather" content="eltOnly"/>
           <element type="date"/>
           <element type="degrees"/>
       </ElementType>
</Schema>
如果你要定位<degrees>这个元素(XMLDocument.documentElement.childNodes.item(1)),你可以按如下方式调用nodeTypedvalue来访问它的类型定义值:
XMLDocument.documentElement.childNodes.item(1).nodeTypedvalue)。

第9课:使用C++ XML DSO

什么是C++ XML DSO?
Microsoft Internet Explorer 5中内嵌了一个C++数据源对象(DSO),可以用来把XML连接到HTML中。Microsoft Internet Explorer 4中内嵌的Java XML DSO在Internet Explorer 5中仍然支持,但是新的C++ DSO有更好的性能,还可以直接连接XML数据岛。
如何把XML连接到HTML上?考虑下面的XML文件:
<universities>
  <university>
    <name>UCSB</name>
    <location>Santa Barbara, CA</location>
  </university>
  <university>
    <name>University of Texas at Arlington</name>
    <location>Arlington, TX</location>
  </university>
  <university>
    <name>USM</name>
    <location>Hattiesburg, MS</location>
  </university>
  <university>
    <name>Baylor</name>
    <location>Waco, TX</location>
  </university>
</universities>
可以用以下的HTML把这个XML连接到一个重复表中:
<XML ID=XMLDoc src="universities.XML"></XML>
<TABLE DATASRC="#XMLDoc" BORDER=1>
  <THEAD><TH>NAME</TH><TH>LOCATION</TH></THEAD>
  <TR>
    <TD><SPAN DATAFLD="name"></SPAN></TD>
    <TD><SPAN DATAFLD="location"></SPAN></TD>
  </TR>
</TABLE>
这里不需要<APPLET> 或 <OBJECT>标签,因为XML DSO已经为你完成了这些工作

第10课 :在C++ XML DSO中使用主/细节特征

什么是主/细节特征?
新的主/细节特征允许你连接到一个分层纪录集的当前记录上,这就意味着你可以把当前纪录的子元素连接到一个截然不同的表中。例如,考虑一下的XML
<orders>
  <order order_number="2233">
    <customer>
      <name>John Smith</name>
      <custID>192883</custID>
    </customer>
    <item>
      <name>Fly Swatter</name>
      <price>9.99</price>
    </item>
  </order>
  <order order_number="2234">
    <customer>
      <name>Marea Angela Castaneda</name>
      <custID>827145</custID>
    </customer>
    <item>
      <name>Fly Paper</name>
      <price>15.99</price>
    </item>
  </order>
  <order order_number="2235">
    <customer>
      <name>Amy Jones</name>
      <custID>998022</custID>
    </customer>
    <item>
      <name>Mosquito Netting</name>
      <price>38.99</price>
    </item>
  </order>
</orders>
你可以允许你的用户通过ID来定位订单,并显示(也仅能显示)当前订单上的客户和项目信息,你的用户并不能查看所有订单的信息——仅能查看自己感兴趣的。

如何连接到细节?

连接到层次结构中的底层(细节信息)的关键是了解你的数据的结构,上面的XML在根元素<orders>中含有有三个元素。基于XML DSO所采用的试探法,每一个订单都映射到一个包含"order_number"、 "customer"、 和 "item"等域的行集中。"order_number"列包含"order_number"属性的值,"customer"和"item"列包含指向各自的"customer"和"item"纪录集的指针。"customer"记录集中包含带有"name"和"custID"域的元素的值,"item"
记录集中包含带有"name"和"price"域的元素的值。

这样,在顶层("orders")纪录集中,你可以找到"order_number"的值,然后允许你的用户通过"order_number"定位订单。
<P>ORDER NUMBER: <SPAN DATASRC="#XMLDoc" DATAFLD="order_number"></SPAN></P>
现在再添加几个按钮来帮助用户浏览"orders"纪录集。
<INPUT TYPE=BUTTON value="Previous Order" onclick="XMLDoc.recordset.movePrevious()">
<INPUT TYPE=BUTTON value="Next Order" onclick="XMLDoc.recordset.moveNext()">

为了在当前纪录的子元素中检索这个值,创建一张表并把表的 DATASRC 属性设置为"#XMLDoc",就和上面所作的一样,但是这时也要把它的 DATAFLD 属性设置为 "customer"。这是为了告诉表连接到"customer"纪录集中的数据上,而"customer"纪录集由"orders"纪录集中的"customer"域的指针指向。
<TABLE DATASRC="#XMLDoc" DATAFLD="customer" BORDER>
  <THEAD><TH>NAME</TH><TH>ID</TH></THEAD>
  <TR>
    <TD><SPAN DATAFLD="name"></SPAN></TD>
    <TD><SPAN DATAFLD="custID"></SPAN></TD>
  </TR>
</TABLE>
接着对"item"元素作同样的处理。
<TABLE DATASRC="#XMLDoc" DATAFLD="item" BORDER=1>
  <THEAD><TR><TH>ITEM</TH><TH>PRICE</TH></TR></THEAD>
  <TR>
    <TD><SPAN DATAFLD="name"></SPAN></TD>
    <TD><SPAN DATAFLD="price"></SPAN></TD>
  </TR>
</TABLE>
现在,当用户点击按钮并移到纪录集中的后一个或前一个纪录时,表中的数据会相应的改变到当前纪录

 
 
   
 
网上赚钱申请指南
 

友情链接
个人主页
 
 
 
 

wel come to . 欢迎光临
宇宙浪仔