XML - 数据交换管理/基本数据结构
上一章 | 下一章 |
← 单个实体 | 一对多关系 → |
学习目标
|
在回顾数据管理的四大核心问题(捕获、存储、检索和交换)时,典型的 XML 用户会遇到在整个存储和交换阶段应用于各种数据的重复的基本结构模式。这些模式始终重复出现,因为它们的使用超出了底层数据处理的特定上下文。我们称这些模式为“数据结构”(或数据类型)。
在本节中,我们将讨论一些最基本的数据结构,并解释它们为何有用以及如何使用 XML 处理它们。
我们从一个简单的例子开始。考虑一个单人家庭的普通杂货购物清单。
购物清单示例
Andy's shopping list: * eggs * cough syrup(pick up for granny) * orange juice * bread * laundry detergent **don't forget this**
在分析此购物清单中包含的信息的各个方面时,我们可以进行一些基本概括
- 可移植性:购物清单可以轻松地表示和传输。如果需要,它可以存储在数据库中并由定制软件处理,但它也可以轻松地写在纸上;
- 可理解性:购物清单很容易被其目标受众(在本例中,是唯一编写此清单的人)理解,因此不需要额外的信息或结构即可立即使用;
- 适应性:如果需要进行任何更改(例如添加或删除清单项目),则存在现有的且众所周知的完成此操作的方法(例如,在手写清单的情况下,只需写下新条目或划掉不需要的条目)。
有了前面的例子作为背景,我们现在可以介绍“基本数据结构”的基本概念。
“基本数据结构”的概念描述了我们用来存储数据的基本约定,以便我们可以更轻松地交换数据。当我们遵循这些基本约定时,我们有助于确保信息的可移植性、可理解性和适应性。 |
现在我们已经介绍了数据结构的概念,我们可以从一些具体的定义开始,然后在我们的购物清单示例的上下文中回顾这些定义。
以下术语定义了我们在本章中使用的“核心”数据结构[1],这些术语按复杂度递增的顺序排列
- SimpleBoolean:任何可以表示为“真”或“假”的值。
- SimpleString:连续的字符序列,包括字母数字字符和非字母数字字符。
- SimpleSequence:项目的枚举,通常可以通过数字索引访问。
- 名称-值对:与单个值关联的任意单个名称。
- SimpleDictionary:项目的枚举,通常可以通过字母数字索引访问。
- SimpleTable:列和行的有序排列。SimpleTable 可以被分类为“复合”数据结构(例如,SimpleSequence,其中序列中的每个项目都是单个 SimpleDictionary)。
在回顾这些“核心”数据结构时要记住的一点是,它们是基本的和互补的。也就是说,核心结构组合使用可以形成更复杂的结构。一旦读者理解了这一事实,就会发现,使用 XML,除了这些“核心”数据结构之外,没有可想而知的应用程序或数据规范无法完全描述。
一旦我们理解了“核心”数据结构,我们就可以将它们组合使用来表示任何可想而知的结构化信息。 |
现在回顾上面的“购物清单示例”。当我们将它与我们刚刚定义的“核心”数据结构进行比较时,我们可以做出一些相当直接的观察
- 整个购物清单无法使用 SimpleBoolean 数据结构表示,因为信息比“真”或“假”更复杂。
- 整个购物清单可以使用 SimpleString 表示。
- 可能有一些原因让我们不想使用 SimpleString 来表示整个购物清单。例如,我们可能希望将清单传输到数据库或其他软件应用程序中,然后能够对清单中的单个项目进行排序、查询、复制或以其他方式处理。因此,将整个清单视为 SimpleString 会使我们的处理要求变得复杂。
在 XML 中表示 SimpleString 的不同方法
<Example>
<String note="This XML attribute contains a SimpleString.">
This XML Text Node represents a SimpleString.
</String>
<!-- This XML comment contains a SimpleString -->
<![CDATA[ This XML CDATA section contains a SimpleString. ]]>
</Example>
在 XML 中表示 SimpleSequence 的不同方法
<Example>
<!-- use a single XML attribute with a space-delimited list of items -->
<ShoppingList items="bread eggs milk juice" />
<!-- use a single XML attribute with a semicolon-delimited list of items
(this allows us to add items with spaces in them) -->
<ShoppingList items="bread;cough syrup;milk;juice;laundry detergent" />
<!-- yet another way (but not necessarily a good way)
using multiple XML attributes -->
<ShoppingList item00="bread" item01="eggs" item02="cough syrup" />
<!-- yet another way
using XML child elements -->
<ShoppingList>
<item>eggs</item><item>milk</item><item>cough syrup</item>
</ShoppingList>
</Example>
SimpleTable (XML_Elem)
<table>
<tr><item>eggs</item><getfor>andy</getfor><notes></notes></tr>
<tr><item>milk</item><getfor>andy</getfor><notes></notes></tr>
<tr><item>laundry detergent</item><getfor>andy</getfor><notes></notes></tr>
<tr><item>cough syrup</item><getfor>granny</getfor><notes>try to get grape flavor</notes></tr>
</table>
SimpleTable (XML_Attr)
<table>
<tr item="eggs" getfor="andy" notes="" />
<tr item="milk" getfor="andy" notes="" />
<tr item="laundry detergent" getfor="andy" notes="" />
<tr item="cough syrup" getfor="granny" notes="try to get grape flavor" />
</table>
SimpleTable (XML_Mixed)
<table>
<tr>
<item getfor="andy" >eggs</item><notes></notes>
</tr>
<tr>
<item getfor="andy" >milk</item><notes></notes>
</tr>
<tr>
<item getfor="andy" >laundry detergent</item><notes></notes>
</tr>
<tr>
<item getfor="granny">cough syrup</item><notes>try to get grape flavor</notes>
</tr>
</table>
为了进一步说明基本数据结构如何在许多不同的上下文中应用,这里将检查和比较前面列出的某些基本数据结构在计算机编程中的上下文。
在比较的第一部分,我们检查了通用术语与编程语言中常用的术语。
- SimpleBoolean:通常称为
boolean
,通常可以取true
或false
,0
或1
,或其他值,具体取决于语言。 - SimpleString:通常称为
string
或stringBuffer
。 - SimpleSequence:编程中按数字索引的变量通常用
array
表示。 - Name-value pair:(将在下面更详细地解释)
- SimpleDictionary:这些通常用
dictionary
或associative array
表示。 - SimpleTable:(将在下面更详细地解释)
现在我们已经介绍并讨论了基本数据结构的具体示例,这里有一些适用于所有数据结构的技术考量,对于可能负责实施和设计 XML 架构以处理特定实施场景的人来说,这些考量尤其重要。
- 确切的术语取决于上下文:虽然这里描述的“基本”结构适用于许多不同的场景,但用于描述它们的术语可能会重叠或冲突。例如,这里使用的术语“SimpleSequence”与许多编程语言中称为“array”的术语非常接近。类似地,术语“SimpleDictionary”是某些编程语言中称为“associative array”的简写。虽然这种密切关联是故意的,但必须始终牢记,特定应用程序或编程语言的具体细微差别将需要额外关注。有时,当深入研究任何给定项目或技术中任何特定数据结构的细节时,会产生轻微的冲突或差异。
- 基本结构是灵活的概念:结构可以根据彼此定义,某些结构可以递归应用。例如,可以使用 SimpleString 和一些基本假设轻松地定义 SimpleSequence。(例如,SimpleSequence 是一个字母数字字符的字符串,其中序列中的每个项目都由一个或多个空格字符隔开:“eggs bread butter milk”)。
- 抽象结构倾向于隐藏棘手的细节:例如,术语“SimpleString”描述了字符序列的抽象概念(例如,“ISBN 0-596-00327-7”)。抽象概念相当直观且简单。然而,用于实现该抽象概念并将其表示为真实运行代码的精确表示法完全是另一回事。不同的编程语言和不同的环境可能使用不同的约定来表示相同的“字符串”。由于这种可变性,人们还可以认识到 XML 中“SimpleString”的抽象概念也取决于任何给定项目的需要而具有不同的表示形式。
- ↑ 重要说明:这里使用的基本术语是概括。虽然它们可能与特定软件、特定编程语言或特定应用程序中使用的术语一致,但这些术语并非旨在作为技术精确的定义。这里描述的概念旨在帮助强调 XML 中可互操作性的上下文无关原则。