在设计XML结构时,我有时会发现自己想要在同一个实例文档中出现的多个元素类型中使用类似的模式。
例如,如果您希望将数据和元数据(有关数据的数据)分开,Head-Body pattern通常很有用,有时对于文档中的多种类型元素使用该模式有意义(虽然结构不同)。
当您在多种元素类型中使用相同的模式时,它是否有意义:
A )保持元素名称相同?所以你可能有多种不同类型的元素叫做“Head”,每个元素都有不同的结构......(你的“DataSnapshot”元素里面可能有一个“Head”元素,你的“CompiledDataSet”元素可能有一个“Head”其中的元素,“头”元素都有不同的结构。)
B )或者您的元素名称是否与模式中定义的类型匹配?因此,“DataSnapshot”元素中的head元素可能被命名为“DataSnapshotHead”而不仅仅是“Head”,而“CompiledDataSet”元素可能有一个名为“CompiledDataSetHead”的头元素。
A 的优点是可以使模式显而易见并保持名称简短。但我猜测,当元素名称相同但结构不同时,人们可能会感到困惑。我认为它可能会使某些类型的XPath查询更加复杂(不确定 - 我没有多少使用XPath)。
B 通常需要更长的元素名称,并且不太清楚使用相同的模式。但至少元素名称会清楚它们的类型。
以下是方法 A :
的示例<DataSnapshot>
<Head>
<!-- meta-data that's specific to the
DataSnapshot -->
</Head>
<DataSets>
<StandardDataSet setId="abc">
<Head>
<!-- meta-data that's specific to the
StandardDataSet -->
</Head>
<Values>
<!-- List of values, specific to the
StandardDataSet in their structure -->
</Values>
</StandardDataSet>
<CompiledDataSet setId="xyz">
<Head>
<!-- meta-data that's specific to the
CompiledDataSet. Different structure
to the Head of the StandardDataSet. -->
</Head>
<Values>
<!-- List of values, specific to the
CompiledDataSet in structure.
i.e. different to those of the
StandardDataSet -->
</Values>
</CompiledDataSet>
<!-- Any number of DataSets of different types could
go here -->
</DataSets>
</DataSnapshot>
请注意,上面的示例有多个名为“Head”和“Values”的元素,它们的类型不同。
如果使用 B 方法,则上面的示例将具有以下元素名称:DataSnapshotHead,StandardDataSetHead,StandardDataSetValues,CompiledDataSetHead,CompiledDataSetValues。 XML会更笨重,但解析会更清晰或更容易吗?
我正在设计一个公共XML API,这就是为什么我对这样的细节感到困惑。我希望这个API尽可能直观且易于解析。我一直在寻找与此相关的最佳实践,但我的Google技能似乎并没有达到它 - 我刚刚找到了很多关于在XML Schema中重用类型的建议,但没有关于重用元素名称的建议。所以我希望你们中的一些人使用比我更多的XML,可能会有一些关于哪种方法更好的圣人建议?
答案 0 :(得分:1)
恕我直言,倾向于(B)并建议不要重复使用元素名称,除非你明确地将它们移动到不同的名称空间中,因为你的模式的用户可能正在使用像'Head等那样的'懒惰'Xpath表达式。
答案 1 :(得分:1)
实际上,您的方法 A 和 B 并不相互排斥。
此处名称空间可以提供帮助。命名空间的主要目的是消除在不同上下文中使用的其他相同名称的歧义,或者如语言学家所说,在不同的主题世界中消除歧义。
因此,我会使用:
snap:head
和
ds:head
其中snap:
和ds:
是分别绑定到我定义的名称空间的名称空间前缀:"headBody:Data SnapShot"
和"headBody:Data Set"
。
此方法具有以下优点:
将每个名字放在自己的主题世界中。
避免名称冲突。
保持名称简短,易读且有意义。
鼓励分层思考和建模。