职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 1252|回复: 2

XML简明教程

[复制链接]
cayean 发表于 2007-7-23 17:11 | 显示全部楼层 |阅读模式
<一>处理XML元素

什么是XML元素?
  XML是一种标识语言,一组用来创建描述数据的语法标签的规则集。一个XML元素是由开始标签、结束标签以及标签之间的数据构成的。开始和结束标签用来描述标签之间的数据。标签之间的数据被认为是元素的值。例如,在下面一个XML元素的例子中,元素\"director\"的值是\"Ed Wood\"。
<director>Ed Wood</director>
  元素名(\"director\")允许你把\"Ed Wood\"这个值标出来,这样你就能把这些数据同另外类似的数据区分开来。例如,有可能另一个元素的值也是\"Ed Wood\"。
<actor>Ed Wood</actor>
  由于每个元素都有不同的标签名,所以你能很容易把上面两个元素的值区别开来。如果从语义上没有办法把数据标出来,两个有同样值的元素会混淆起来。


属性
  一个元素可以包含一个或多个属性,属性是一个由\"=\"隔开的名称值,如:
<CITY ZIP=\"01085\">Westfield</CITY>
  在上面的例子中,ZIP=\"01085\"是元素<CITY>的一个属性。属性用来给一个元素添加附加的、次要的信息,通常是元信息,属性还可以使用缺省值,而元素却不能这样做。元素的每一个属性可以以任意顺序进行说明,但仅能说明一次。
此外,XML标签对大小写敏感,因此以下这三个是不同的元素。
<City><CITY><city>

<二>处理XML文档
什么是XML文档?
  一个基本的XML文档就是一个XML元素,它可以嵌套XML元素。例如,下面的XML元素\"books\"就是一个有效的XML文档。
<books>
<book isbn=\"0345374827\">
<title>The Great Shark Hunt</title>
<author>Hunter S. Thompson</author>
</book>
</books>

处理指导
构建一个基本的XML文档需要记住关键的四点:
所有元素必须有结束标签;
所有元素必须正确的嵌套(不允许交迭元素);

所有特征值必须加引号;
每一个文档都必须有一个唯一的第一元素和根节点。

<三>处理XML数据岛
什么是XML数据岛?
  数据岛是指存在于HTML页面中的XML代码。数据岛允许你在HTML页面中集成XML,对XML编写脚本,而不需要通过脚本或<OBJECT>标签读取XML。几乎所有能够存在于一个结构完整的XML文档中的东西都能存在于一个数据岛中。包括处理指示、DOCTYPE声明和内部子集。(注意,编码串不能放在数据岛中。)
  <XML>元素标记数据岛的开始,它的ID属性提供了一个可以用来引用数据岛的名称。

数据岛的XML可以是内嵌的:
<XML ID=\"XMLID\">
<customer>
<name>Herbert Hanley</name>
<custID>81422</custID>
</customer>

</XML>
或者在XML标签中通过SRC属性引用:
<XML ID=\"XMLID\" SRC=\"customer.xml\"></XML>
也可以使用</SCRIPT>标签来创建一个数据岛:
<SCRIPT LANGUAGE=\"xml\" ID=\"XMLID\">
<customer>
<name>Mark Hanson</name>
<custID>81422</custID>
</customer>
</SCRIPT>

<四>使用XML对象模型
什么是XML对象模型?
  XML对象模型是一个对象集,可以使用这个对象集来访问或处理存储在XML文档中的数据。XML文档构成一颗树,树上的每一个元素可以看作是一个节点,具有不同属性和方法的对象代表了树和它的节点,每个节点包含文档中的实际数据。
如何访问树中的节点?
  可以通过象脚本来访问树中的节点。这些对象是在解析器装载并解析XML文档时由XML解析器创建的。通过ID值可以引用树,或文档对象。在下面的例子中,MyXMLDocument是文档的对象的ID值,使用文档对象的属性和方法可以访问树的根和子节点对象。根,或文档元素,是最顶层的节点,子节点从根上扩展开形成XML树。根节点只可以在文档中出现一次。
...
下面列出了一些简单的属性和方法,可用来访问XML文档的节点。
XMLDocument:返回对XML文档对象模式的引用。
documentElement:返回XML文档的根节点。
childNodes:返回节点的孩子节点目录。
item:通过索引访问目录中的个别节点。索引值是从0开始的,所以item(0)返回第一个节点。
text:返回节点的内容。
下面是一个带有数据岛的HTML页面。数据岛被包含在

你能通过ID属性访问数据岛,\"resortXML\"成为文档对象的名称。你能利用这个对象的方法和属性访问它的根节点和孩子节点。在上面的例子中,根节点是,孩子节点是。
下面的代码访问第二个孩子节点并返回它的内容\"Na Balam Resort\"。
resortXML.XMLDocument.documentElement.childNodes.item(1).text
如何获得XML DOM树的信息?
有以下几种方法和接口来获得DOM的信息。
如果使用脚本语言,DOMDocument对象提供load、loadXML、save方法和xml属性。
对Visual Basic 和 C 或 C++ 编程者来说,IXMLDOMDocument接口提供和DOMDocument对象同样的成员。
IXMLDOMDocument也可以实现标准的COM接口,如IPersistStreamInit、IPersistMoniker和IStream。

<五>使用XML名域
什么是XML名域?
  XML名域是一组可以用作XML文档的元素或属性名称的名称集。为了避免元素之间出现相同名称的冲突,名域限定Web中的名称必须是唯一的。名域由某些URI(Universal Resource Identifier)来进行识别,不管是URL(Uniform Resource Locator),还是URN(Uniform Resource Number)都没有关系,它并不管指向的什么内容。URI使用简单,因为它们在Internet上是全球唯一的。
  名域可以显式声明,也可以缺省声明。在显式声明中可以定义一个简写形式或是一个词头来代替整个名域,可以使用这个词头来引用属于名域的元素。当节点包含不同名域的元素时,显式声明非常有用。缺省声明声明一个可以被所有元素访问的名域,而且并不定义词头。
<BOOKS>
<bk:BOOK xmlns:bk=\"urn:BookLovers.org:BookInfo\"
xmlns:money=\"urn:Finance:Money\">

<bk:TITLE>A Suitable Boy</bk:TITLE>
<bkRICE money:currency=\"US Dollar\">22.95</bkRICE>
</bk:BOOK>
</BOOKS>
  所有以\"bk:\"或\"money:\"开头的元素都可以看成是分别来自于名域\"urn:BookLovers.org:BookInfo\"或\"urn:Finance:Money\"。
如何声明缺省名域?
  在名域声明时没有词头就属于文档的缺省名域,文档中所有没有词头的元素和属性都属于缺省名域。下面的例子声明了<BOOK>元素和<BOOK>中所有的元素(<TITLE>, <RICE>, currency)都属于名域\"urn:BookLovers.org:BookInfo.\"。
<BOOK xmlns=\"urn:BookLovers.org:BookInfo\">
<TITLE>A Suitable Boy</TITLE>
<RICE currency=\"US Dollar\">22.95</PRICE>
</BOOK>

<六>使用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 Schema的XML文档。
如何建立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的根元素中的名域声明。第一个(xmlns=\"urn:schemas-microsoft-com:xml-data\")表明这个XML文档是一个XML Schema。第二个(xmlns:dt=\"urn:schemas-microsoft-com:datatypes\")允许schema处理者在ElementType和AttributeType声明中的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-mic
rosoft-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, 包括一个有相关schema的XML文档。下载这些示例程序可以与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。

<七>在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=\"arra
y1\"/>

<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文档中使用的数据类型的列表。

<八>访问经过类型定义的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)。

<九>使用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已经为你完成了这些工作。

<十>在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\"定位订单。
<>ORDER NUMBER: <SPAN DATASRC=\"#xmlDoc\" DATAFLD=\"order_number\"></SPAN></P>
  现在再添加几个按钮来帮助用户浏览\"orders\"纪录集。
<INPUT TYPE=BUTTON value=\"revious Order\" onclick=\"xmlDoc.recordset.movePrev
ious()\">
<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>RICE</TH></TR></THEAD>
<TR>
<TD><SPAN DATAFLD=\"name\"></SPAN></TD>
<TD><SPAN DATAFLD=\"price\"></SPAN></TD>
</TR>
</TABLE>
  现在,当用户点击按钮并移到纪录集中的后一个或前一个纪录时,表中的数据会相应的改变到当前纪录。

该文章转载自[编程助理站]:http://www.91duoduo.com/jishu/xml_xx.asp?noid=cebirm1ycsAc0ik
江南枫 发表于 2011-8-17 12:18 | 显示全部楼层
原来是这样
曾经的小孩 发表于 2011-8-18 13:32 | 显示全部楼层
不是吧~~
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-4-26 05:25 , Processed in 0.147204 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表