1.2 分析问题
作为一种基于文本的格式,XML支持程序文件和脚本文件中的文本或脚本。XML还可以对生成的内容进行标记。在葡萄酒酿造厂的案例中,从将酿酒厂的数据存储到数据库中,到从数据库中提取XML到市场订单中以输出客户出货分类信息,到处都可能用到XML信息。在开始使用XML之前,首先回顾一下它的历史。
1.2.1 XML的简要历史
在XML之前有多种标记语言,但标记语言的历史始于SGML(Standard Generalized Markup Language),即标准通用标记语言。
1. SGML与XML的发展
1986年,SGML被采用为国际标准(ISO 8879)。SGML使用的工具和方法得以发展,虽然并没有像期望的那样被广泛采用。
类似于SGML的标记语言是一种文本语言,这种语言可以以独立于硬件、软件、格式或操作系统的方式对内容进行描述。标记语言文档在工具和系统中可以互换。SGML为它的缩减版XML铺平了道路。
SGML标准和现在的XML标准都允许企业访问此类信息:
Melvin Winery "Muscadine Scupp" Wine,
Vintage 1998
Available in 750ml only.
Our complex purple Muscadine grape lends an assertive aroma and flavor, with a
semi-sweet velvety smooth finish.
也可以将标记信息用于数据,以便更详细地进行标识。要标记内容,只需简单地将描述性的标记用于每个元素,大多数情况下只需一个起始标记和一个结束标记。语法如下:
<element>content</element>
<element>表示标记的起始位置。其中,element是标记元素名称的占位符。</element>表示标记的结束位置,位于内容的后面。
例如,前面所述的信息标记如下:
<wine id="Muscadine_750ml">
<name>Muscadine</name>
<varietal>Scupp</varietal>
<vintage>1998</vintage>
<winery>Melvin</winery>
<bottlesize>750ml</bottlesize>
<description>Our
complex purple Muscadine grape lends an assertive aroma and![]()
flavor, with a semi-sweet velvety smooth finish.</description>
</wine>
如果对这个例子中的尖括号、斜线和其他标记符号不熟悉,那么也不用着急,本章很快就会对所有这些内容进行详细的解释。
2. XML的设计
在20世纪90年代中期,使用SGML标记元素集合的功能创建了HTML(Hypertext Markup Language,超文本标记语言),HTML提供了很多方法来创建标记并用浏览器技术显示这些标记。但是HTML只能将数据标记为标题、列表、段落或其他简单的面向格式的内容,而不能描述内容的语义。这时就需要使用更强大的工具。
XML被设计成是比SGML范围更窄的语言,可以用更轻便的处理器和分析器通过Internet(或其他途径)提供内容。
W3C的“XML 1.0 推荐”描述了XML的初始目标。这些设计目标列于W3C的网站中,具体如下所示:
● XML应该在Internet上直接可用。
● XML应该广泛支持各种不同的应用程序。
● XML应该与SGML兼容。
● 处理XML文档的程序应该很容易撰写。
● XML中的选择性功能应当无条件地保持最少,理想状况下为零。
● XML文档必须易读而且相当清楚。
● XML设计的准备工作应该能迅速地完成。
● XML的设计应该是正式的、简洁的。
● XML文档应该易于创建。
● XML标记的简洁性应放在最后考虑。
XML的设计是针对HTML的缺陷(部分在于扩展性和可重用性)和SGML超出普通用户管理能力的繁琐之处的。
1.2.2 了解XML基础
标记的基本单位是元素。元素可以包含文本、图片路径、表数据,甚至其他元素。
创建一个信息模型时,要定义一个信息层次结构。信息层次结构描述元素的使用和组织方式。内容包含在层次结构中,并且由所使用的元素进行一定的控制。由于有些元素是层次嵌套在其他元素内部的,所以它们与包含它们的元素之间有关联。这种关联在对数据进行检索和排序时是很有用的。元素的层次嵌套规则如下:
● 层次性地包含其他所有元素的主元素称为根元素。
● 在起始标记和结束标记之间包含其他元素的元素称为这些元素的“父元素”,而包含在内的元素则为该元素的“子元素”(在更深层次上的元素不是子元素而是子孙)。
● 一个元素可以是某个元素的子元素,同时也是其他元素的父元素(对于一个元素,它的父元素的父元素,以及再往上层次的父元素,都可以认为是该元素的祖先)。
● 同一父元素的子元素之间是兄弟关系(对于元素来说,不存在阿姨、叔叔或表亲的关系)。
例如,在一个表示一本书中一个章节的XML实例(文档)中,可以设计一个层次结构,其中,<chapter_title>子元素始终以<chapter>开始,<chapter>为根元素。要在结构上设置一个<chapter_title>的兄弟元素,可以用<intro>元素,后面紧接着<numbered_list>元素。这些兄弟元素将位于<chapter_title>元素的下面,从而确保标题信息始终最先出现。下面的XML标记示例说明了刚刚描述的层次结构:
<chapter>
<chapter_title>Changing the Battery</chapter_title>
<intro>In this chapter, we review the procedures for changing a battery.</intro>
<numbered_list>
<item>Open the rear panel of the device.</item>
<item>Using a screwdriver, pry the old batteries out.</item>
<item>Insert the new batteries, using a hammer as needed to fit.</item>
</numbered_list>
.
.
[the rest of the document would be here]
.
</chapter>
本例中,<chapter>是<chapter_title>、<intro>和<numbered_list>的父元素。<chapter>的所有子元素都是兄弟元素。对于所有的<item>元素来说,<chapter>元素不是父元素,它们的父元素是<numbered_list>。从位置上来说,<chapter>是“曾祖父”,但是在XML中并不这么称呼,而是把<item>元素称为<chapter>元素的“子孙”元素。
因为在章和标题之间、引言和章之间有层次对应关系,所以可以通过使用处理标记的工具将这些内容作为一个整体进行检索和管理。如果搜索工具发现了章的标题,并显示在搜索结果中,访问结果的人就可以很容易看到它是某一章的一部分。在搜索程序检索出整章之前,甚至可以在搜索结果中通过<intro>元素获得显示引言段落的界面。
有些元素显示为空元素,没有起始标记和结束标记。这些元素不包含文本内容,但是在标记中可用于某些目的。例如:
<img src="imemine.jpg" />
上面的代码被识别为空元素,因为结尾处的斜线位于标记内部,而不是位于一个单独的结束标记内。图像是一个常见的空标记的例子,因为通常情况下图像只有一个不包含任何文本内容、只有标记和属性数据的路径(如同上面的例子所示)。
属性将在后面再作讨论,简单地说,属性是关于元素的附加信息,位于起始标记内或空标记中。属性都有名称,后面加上用引号包括的值。在接下来的XML标记中将介绍更多示例。
1.2.3 以葡萄酒酿造厂为例使用标记
下面深入查看一下前面显示的酿酒厂的标记:
<wine id="Muscadine_750ml">
<name>Muscadine</name>
<varietal>Scupp</varietal>
<vintage>1998</vintage>
<winery>Melvin</winery>
<bottlesize>750ml</bottlesize>
<description>Our complex purple Muscadine grape lends an assertive aroma and ;
flavor, with a semi-sweet velvety smooth finish.</description>
</wine>
标记是置于内容周围的用尖括号括起来的部分。第一行代码是根元素<wine>的起始标记:
<wine id="Muscadine_750ml">
现在先忽略id=“Muscadine_750ml” 元数据。下一行代码标识了葡萄酒的名称:
<name>Muscadine</name>
起始标记<name>显示了内容开始的位置,结束标记</name>关闭了元素。
varietal标记进一步标识了葡萄酒,可以用于后面要显示的葡萄酒的排序和选择:
<varietal>Scupp</varietal>
vintage是关键数据,因为通常葡萄酒都是基于酒龄进行选择的:
<vintage>1998</vintage>
假设从本厂和其他酿酒厂获取的数据被合作商或旅行社用于总清单中,那么酿酒厂的名字将包含在标记中:
<winery>Melvin</winery>
该标记也可以用于与目录出版商共享。而在酿酒厂内部,这种信息很可能毫无用处。
列出可用的瓶子大小将对数据排序或企业库存管理有所帮助。
<bottlesize>750ml</bottlesize>
<description>标记对葡萄酒的促销信息进行描述:
<description>Our complex purple Muscadine grape lends an assertive aroma and ;
flavor, with a semi-sweet velvety smooth finish.</description>
用户可以参考这些信息来选择合适的葡萄酒。描述信息可以直接在销售点使用,或显示在浏览器上用于在线阅读。还能与一些关键信息一起使用,以便更好地帮助搜索程序找到最佳葡萄酒。
最后,葡萄酒元素的结束标记与第一行代码类似,用来退出文档:
</wine>
对于刚开始使用的人来说,这些XML标记信息已经足够,以后将学习如何更好地识别XML代码。下面对以酿酒厂为例的XML进行更详细的讨论。
1.2.4 决定葡萄酒酿造厂的XML信息模型
XML文档的元素标记提供关于内容的描述信息。这就使得我们可以格式化信息模型,创建内容的具体规则。
为数据建立信息模型时,必须识别组成文档结构的所有部分,以及各内容之间的所有层次关系。在前面的示例中,标记将内容识别为<wine>元素的一部分。
1. XML元素
XML可以对需要的每个元素进行命名和定义,并为这些元素指定元数据(属性)。可以按自己喜欢的方式对元素进行命名。这种描述性很强的标记可以用来检索、重用和传递内容。
Here is an example of an XML document using element names defined for accounting
data.
<accounting>
<invoice>
<inv_number>8559</inv_number>
<inv_recipient>
<company_name>Mad Melvin Inc.</company_name>
<contact_name>Melvin Brock</contact_name>
<address1>100 Brockway Hill, Suite 1</address1>
<city>Kenmore</city>
<state>NY</state>
<zip>14223</zip>
</inv_recipient>
<amount>199.00</amount>
<due_date>2006/11/02</due_date>
</invoice>
</accounting>
会计数据与酿酒厂的目录数据截然不同,会计数据对元素命名和层次结构的组织提供了指导。本例中,<invoice>元素是<accounting>元素唯一的子元素,是<inv_number>、<inv_recipient>、<amount>和<due_data>元素的父元素。<inv_recipient>是<company_name>、<contact_name>、<address1>、<city>、<state>和<zip>的父元素。所有<invoice>和<inv_recipient>的子元素都是<accounting>元素的子孙。这些标记的运用使得调用发票金额、发票支付日期或采购者地址信息更加简单。
在为内容选择最适合的信息模型时,需要考虑拥有哪些信息、如何使用这些信息、数据集内需要增加哪些额外信息。然后根据需要创建元素标记和XML文档。
注意:
不要力求建立一个完美的结构,这是不切实际的。不可能建立一个完全错误或完全正确的结构,只要它符合逻辑、满足需要就可以了。在实行过程中,可能会发现必须调整结构,以适应XML的扩展性设计。
为了确保数据的完整性,不仅要在开始之前还要在开始后的每个阶段分析情况。只要有必要,就可以通过删除元素、增加元素、重命名元素或调整层次结构来修改元素集。本书中对分析原则进行了介绍。
2. XML声明
所有的XML文档都可以从XML声明开始,XML声明告诉处理程序、工具和用户:该文档使用的是XML而不是其他标记语言。声明是可选择的,并不一定要使用。可以按如下方式进行声明:
<?xml version="1.0"?>
如果使用声明,则必须将它置于XML文件的开头,在根元素的起始标记之前,如下所示:
<?xml version="1.0"?>
<accounting>
<invoice>
<inv_number>8559</inv_number>
<inv_recipient>
<company_name>Mad Melvin Inc.</company_name>
<contact_name>Melvin Brock</contact_name>
<address1>100 Brockway Hill, Suite 1</address1>
<city>Kenmore</city>
<state>NY</state>
<zip>14223</zip>
</inv_recipient>
<amount>199.00</amount>
<due_date>2006/11/02</due_date>
</invoice>
</accounting>
如果生成的XML实例是可重用的小型数据块,可能就不用进行声明,因为它们可能在文件中的任意位置作为组合的程序块结束,除了文件开头以外的任何地方的XML声明将会抛出错误。如果有独立的XML,并且可以由自动化进程来验证是否为XML文件,那么就可以包含XML声明,以确保将文件正确识别为XML文档。
3. 属性与信息建模
XML元素在尖括号内除了包含名称外,还可以包含属性。属性是元素的附加信息,位于元素的起始标记内。
例如,本章之前的示例中的<chapter>元素可以具有author属性。这就表示,作者的姓名虽然不是文档内容部分,但也可以包含在XML标记中。同样也可以包含作者所属大学。结构中的属性可以是必需的,也可以是可选的。标记中通常都会有作者,但有些作者可能不属于某个大学。在这种情况下,姓名属性有值(具体的姓名),但大学属性则不需要。利用这些属性可以通过具体的作者或大学进行搜索来定位信息。下面是一个使用author属性的XML标记:
<chapter author="William Penn">
结束标记仍然是</chapter>,其中不包含属性数据。
有多个属性的元素在属性之间要留一些空格。下面是同时具有author和university属性的<chapter>元素:
<chapter author="William Penn" university="Duquesne">
可以通过元素和相应属性的标记来创建内容。你可以按自己想要的方式设计元素和属性,根据用户的偏好创建动态内容,以便通过不同的介质传递多种格式。
4. 创建XML文档
打开记事本或其他文本编辑器,输入下列数据:
<?xml version="1.0"?>
<wine id="Muscadine_750ml" type="dessert">
<name>Muscadine</name>
<varietal>Scupp</varietal>
<vintage>1998</vintage>
<bottlesize>750ml</bottlesize>
<description>Our
complex purple <keyword>Muscadine</keyword> grape lends an![]()
<keyword>assertive</keyword> aroma and
flavor, with a semi-sweet velvety![]()
<keyword>smooth</keyword> finish.</description>
</wine>
注意:
记住,书的页宽并不总是能容纳整个代码行。
符号表示此处还不能按Enter键,而是继续键入下一行代码。在一条代码结束后按Enter键。
从现在开始,将以下面的示例展开讨论。第3章介绍了创建XML文档必须遵循的规则,学习这些规则之后将了解基本的语义,并能够从零开始创建自己的XML文档。根据这些规则可以创建格式良好的文档,这样分析器——或者浏览器——才可以使用这些文档。
将文件保存为muscadine.xml。所创建的文档可能与图1-1中显示的相似。

图 1-1
注意:
如果文本编辑器是以.txt而不是以.xml为扩展名,那么先将文件重命名为以.xml为扩展名。
现在用支持XML的网页浏览器打开该文件,如使用Microsoft Internet Explorer。元素用视图树表示,每一层可以清楚地显示嵌套层次关系。您的文档可能与图1-2中所显示的相似。

图 1-2
这是确保XML文档可用的第一步。如果不能在浏览器中显示,那么标记中就可能存在错误。
从图1-2中可以看到,在wine和description标记的开始标记之前都有一个小的减号。所有具有后代的元素前面都有一个减号。单击这些减号可以隐藏元素的后代。一旦隐藏了后代,这些减号将显示为加号,单击这些加号就可以显示后代,同时将加号还原为减号。
你可能想让XML按一定的方式显示。如果不是用来显示而是由进程使用,你很可能想让它看起来比视图树更友好一些。
XML可以用字体、颜色和图像定义格式,从而更好地显示在浏览器中,而不是像图1-2那样以视图树的方式显示在Internet Explorer中。使用样式表,如HTML常用的层叠样式表(Cascading Style Sheets,简写为CSS),可以使XML的显示效果更好。XML格式和转换语言——可扩展样式转换语言(Extensible Stylesheet Language Transformation,简写为XSLT)——也可以用来生成XML或者将XML转换成其他类型的基于文本的文档(本书稍后将作介绍)。
1.2.5 XML解决的问题
为了更好地理解XML如何帮助公司项目,下面看一下它的一些使用方式:
● 重用内容到多个输出或设备
● 对于各种不同语言的文本,将XML作为语言之间的跟踪或管理翻译的方法
● 实施结构化编写过程
● 实施数据一致性标准
● 共享非私有数据
1. 重用内容(多个输出,多种介质)
如果您的目标之一是实现结构化的编写,对于重用内容或修订管理需要(或不需要)额外的需求,那么XML编写就成为一种逻辑选择。XML编写工具可以帮助作者确定是否遵循了内容规则。XML文档可以与数据库进行交互,甚至可以作为内容块的一个数据库或仓库,这样就可以对结构化的内容进行排序、处理、提取,甚至自动链接以在单独的文档中重用。
内容管理软件供应商提供系统,帮助用户实现处理内容所需的工具,以此引导公司使用XML。XML格式的内容比基本文本格式和字处理格式的内容更容易管理,因为XML不会陷入私有编码和格式化的困境。另外,XML信息可以通过在内容周围使用元素来标识。内容管理系统使想要创建结构化内容的人员能够结合多种XML编写工具,通过避免对必须使用“一种工具”进行无休止的争论来简化公司的购买行为。通过对各种各样的编写工具进行结合,XML的编写者不用进行变换、转化或其他操作就可以创建和共享内容。
例如,编写工具可以将结构化文档保存为XML,作为成品来提供具有复杂数据体系结构的XML文档。使用脚本语言或样式表,可以将XML内容块从一个文档中提取出来,用于生成其他文档。另外,对数据进行排序和检索可以创建自定义的Web页面、数据库内容或手持设备文件。改变每个链接的内容块时,所有包含相应内容块的文档都会自动更新。
只要信息是XML格式且可访问,就可以用样式表或XSLT将其发布到网络上、PDF、手机、iPod(PodCasts)和一些手持设备。发布信息不再只限于采用印刷的方式。
2. 管理翻译的内容
以多种语言发布信息的公司常常与翻译机构一起合作。在很多情况下,翻译公司利用字处理软件将每个单词翻译成目标语言,并格式化为发布所需的文件格式。服务费用包括翻译费用和格式化(字处理)服务费用。与之不同的是,对XML的翻译不需要额外的格式化,从而节省了大量费用。
因为XML文档可以包含元数据——关于文档以及组成文档的独立块的描述信息——在属性或元素中存储修订信息和语言信息变得更为直接。发送XML文档用于翻译时,客户或翻译机构可以通过附加元数据来表示文档的哪一部分需要翻译。在较长的文档中,只需翻译文档中的新信息,而不用反复地翻译整个文档。
3. 以实施的结构和自动格式化进行编写
使用同一文档或文档集的编写者之间由于不同的工作类型可能会产生矛盾。甚至是同一编写者有时也会对格式化做出不同的决定。另外,不同的编写者组织内容的方式也可能有略微的不同。基于XML的结构化编写环境提供了额外的控制级别——以及独立的格式化——从而使样式指导和编写“建议”有所不同。
结构化编写指导编写者遵循所使用的结构内容模型。这种实施类型不需要编写者对布局、格式和顺序进行抉择。使用结构化编写可以规范化和实施编写、标记以及样式指导原则,确保创建的文档结构正确、格式恰当。
简而言之,编写者可以根据指导原则编写内容,而不用关心格式化问题。
4. 实施数据一致性
XML文档在组织上要一致。元素被命名、定义、标记,从而可以由其他能够阅读XML内容的软件应用程序进行处理。XML文档使内容的检索和重用更加简单。
XML文档包含的元数据可以标识元素何时被创建,由此确保提供正确的最新可用信息。一旦发现错误,可以及时纠正。
例如,如果一个XML文档描述了显示在某个软件工具中的菜单项,开发人员在更新程序清单时就不用担心是否弄错代码位置。类似地,错误消息和其他软件接口部分使用的数据串可以从中心点进行控制,或者通过跟踪一定的元素结构更容易地进行查找。
在后面对源代码所作的改变将立刻自动反映到使用该部分信息的产品或产品线的所有其他区域。在理想情况下,该信息也将到达销售部门。
酿酒厂项目包括列表中葡萄酒的许多细节。为了确保数据始终一致且完整,必须创建一个数据结构来检查XML。丢失的数据位可以被标记在识别或显示XML的编写工具中。不合适的数据也可以被标记,从而使检验和改正错误更加容易。这类标识有助于更容易地修正数据并重新开始使用。
注意:
市场上有许多可以编写或编辑XML的工具。对作者使用的工具将在后面的章节中作简要介绍。
5. 共享数据
为了促进信息交流,有些行业采用了通用结构来规范化信息结构。通过共享通用结构,厂商可使用通用词汇,更简单、快速、廉价地与合作伙伴或客户进行数据交流。
有一些行业是结构化编写和共享结构的早期采用者,他们已经从中获利了很多年。因为这些行业组织共享数据,并在结构化内容处理上投入了很多,他们坚持将合作伙伴、附属公司和客户加入到他们的系统中。
例如,航空公司必须将飞机零件制造商提供的内容与公司本身的文档进行整合。零件制造商提供关于飞机部件的文档,而航空公司创建新的信息用于飞行员训练指导、使用手册等,还可以根据通用结构整合零部件的维护信息。飞机零件制造商利用结构化编写方法与合作的航空公司共享XML(或SGML),从而确保双方使用相同的元素名、元数据和修订数据。
下面是酿酒厂所拥有的关于其合作公司的信息类型示例。该XML比本章先前所讨论的简单示例更加详细,它包括了标记为<keyword>元素的关键字。
<catalog>
<section subject="Wines">
<winery id="Melvin">
<name>Mad Melvin's Muscadine Wines</name>
<region>New York</region>
<country>United States</country>
<wine id="Nags_Head_Carlos_WHT_750ml">
<name>Nags Head Carlos WHT</name>
<varietal>Scupp</varietal>
<vintage>1994</vintage>
<bottlesize>750ml</bottlesize>
<description>Aged
in Carolina Willow Oak, this velvety ![]()
<keyword>red</keyword> wine is highly complex, with a flavor
of red ![]()
<keyword>cherries</keyword>,
<keyword>apricots</keyword> ![]()
and <keyword>grapefruit</keyword>.</description>
</wine>
<wine id="Muscadine_750ml" type="dessert">
<name>Muscadine</name>
<varietal>Scupp</varietal>
<vintage>1998</vintage>
<bottlesize>750ml</bottlesize>
<description>Our complex purple
<keyword>Muscadine</keyword> grape![]()
lends an
<keyword>assertive</keyword> aroma and flavor, with![]()
a semi-sweet velvety <keyword>smooth</keyword> finish.</description>
</wine>
</winery>
</section>
</catalog>
上面所述的标记当然十分有用,虽然它们不如企业范围使用时所需要的那么详细。但是,因为结构中提供了每一种葡萄酒的基本信息,并且包含酿酒厂的名称,所以访问合作伙伴的目录、共享自身的酿酒厂目录,甚至合并两个目录都是可能的。假设酿酒厂数据必须与五指湖地区推销酿酒厂的旅行社共享。
在这个项目中,假设之前的标记是酿酒厂所建立数据的标准。要适当共享这些信息,公司不仅要与其他合作伙伴使用相同的XML文档,理想情况下还要具有相同或相似的结构,在共享信息时最小化相异数据或未使用的多余数据所带来的损失。
要设计一种解决方案来合并目录,首先回顾本公司和合作伙伴的数据,然后决定一种计划来合并数据。
下面是从合作伙伴的葡萄酒的XML目录中选出的一段XML内容:
<?xml version="1.0" encoding="UTF-8"?>
<catalog>
<section subject="Wines">
<distributor id="" name=""/>
<distributor id="Aeg" name="Aegean Imports, INC."/>
<distributor id="Cla" name="Classic"/>
<distributor id="Cou" name="Country Vintner"/>
<distributor id="Emi" name="Eminent Domains"/>
<distributor id="Emp" name="Empire"/>
<distributor id="Fran" name="Franklin Selection"/>
<region name="Western Cape"/>
<winery id="">
<region>Burgundy</region>
<country>France </country>
</winery>
<winery id="ALong">
<region>Chablis</region>
<country>France</country>
</winery>
<wine id="Cabernet_Sauvignon_1992_750ml">
<name>Cabernet Sauvignon</name>
<varietal>Cabernet Sauvignon</varietal>
<vintage>1992</vintage>
<winery>Caskone</winery>
<distributor>Aeg</distributor>
<bottlesize>750ml</bottlesize>
</wine>
<wine id="Chardonnay_1994_750ml">
<name>Chardonnay</name>
<varietal>Chardonnay</varietal>
<vintage>1994</vintage>
<winery>Caskone</winery>
<distributor>Aeg</distributor>
<bottlesize>750ml</bottlesize>
</wine>
<wine id="Sauvignon_Blanc_1994_750ml">
<name>Sauvignon Blanc</name>
<varietal>Sauvignon Blanc</varietal>
<vintage>1994</vintage>
<winery>Caskone</winery>
<distributor>Aeg</distributor>
<bottlesize>750ml</bottlesize>
</wine>
<wine id="Zinfandel_15L">
<name>Zinfandel</name>
<winery>CorbetCanyon</winery>
<distributor>Emp</distributor>
<bottlesize>1.5L</bottlesize>
</wine>
<wine id="The_Cabernet_1996_750ml">
<name>The Cabernet</name>
<varietal>Cabernet Sauvignon</varietal>
<vintage>1996</vintage>
<winery>Cosentino</winery>
<distributor>Emp</distributor>
<bottlesize>750ml</bottlesize>
</wine>
</section>
</catalog>
仔细查看这段XML内容中哪些数据是可用的。第一行代码是XML声明:
<?xml version="1.0" encoding="UTF-8"?>
第二行代码是公司目录元素的开始标记:
<catalog>
目录元素的结束标记在程序清单的最后一行。
虽然没有进行特别的描述,但<section>元素仍通过产品划分目录信息,从而使与葡萄酒相关的数据显示在其中,而其他非葡萄酒产品的数据则包含在XML的其他部分中:
<section subject="Wines">
分销商数据有助于对分销商进行评估,您可能会很惊喜地发现合作公司将这些数据显示在它的XML目录中以共享:
<distributor id="" name=""/>
<distributor id="Aeg" name="Aegean Imports, INC."/>
<distributor id="Cla" name="Classic"/>
<distributor id="Cou" name="Country Vintner"/>
<distributor id="Emi" name="Eminent Domains"/>
<distributor id="Emp" name="Empire"/>
<distributor id="Fran" name="Franklin Selection"/>
<region>元素是分销商数据的兄弟元素,用来命名地区。从结构上看,它与分销商的联系不是很密切:
<region name="Western Cape"/>
源代码中列出了多个酿酒厂,每个酿酒厂用子元素指定了地区和国家。<winery>元素是<distributor>的兄弟元素。
<winery id="">
<region>Burgundy</region>
<country>France </country>
</winery>
<winery id="ALong">
<region>Chablis</region>
<country>France</country>
</winery>
酿酒厂数据之后是每种葡萄酒的详细信息,其中包括其相关酿酒厂和分销商的数据:
<wine id="Cabernet_Sauvignon_1992_750ml">
<name>Cabernet Sauvignon</name>
<varietal>Cabernet Sauvignon</varietal>
<vintage>1992</vintage>
<winery>Caskone</winery>
<distributor>Aeg</distributor>
<bottlesize>750ml</bottlesize>
</wine>
<wine id="Chardonnay_1994_750ml">
<name>Chardonnay</name>
<varietal>Chardonnay</varietal>
<vintage>1994</vintage>
<winery>Caskone</winery>
<distributor>Aeg</distributor>
<bottlesize>750ml</bottlesize>
</wine>
<wine id="Sauvignon_Blanc_1994_750ml">
<name>Sauvignon Blanc</name>
<varietal>Sauvignon Blanc</varietal>
<vintage>1994</vintage>
<winery>Caskone</winery>
<distributor>Aeg</distributor>
<bottlesize>750ml</bottlesize>
</wine>
<wine id="Zinfandel_15L">
<name>Zinfandel</name>
<winery>CorbetCanyon</winery>
<distributor>Emp</distributor>
<bottlesize>1.5L</bottlesize>
</wine>
<wine id="The_Cabernet_1996_750ml">
<name>The Cabernet</name>
<varietal>Cabernet Sauvignon</varietal>
<vintage>1996</vintage>
<winery>Cosentino</winery>
<distributor>Emp</distributor>
<bottlesize>750ml</bottlesize>
</wine>
其中某些葡萄酒包含比其他葡萄酒更详细的信息。
在很大程度上,本公司的数据结构与合作伙伴的目录是相匹配的。除了包括分销商的符号之外,合作伙伴的其他标记使用的元素和属性名称是相同的。必须能够很容易地统一相似数据,以便您的酿酒厂和该合作伙伴共享数据。
XML文档的末尾是该部分(包括所有的葡萄酒产品数据)和整个目录的结束信息:
</section>
</catalog>
以上代码只是该文件中的一部分,从这些代码看来,该公司只结构化了它的葡萄酒产品数据,而没有结构化任何外部提供的信息(装饰、食物、旅行等)。







