XML 和 "flags"

XML and "flags"

在 XML 中编码数字标志变量的 "proper" 方法是什么?

我正在转换一个在几个系统之间转储数据的程序。 目前转储是一个制表符分隔值文件(制表符在这里显示为⟿):

blah de blah ⟿ blargh ⟿ 176 ⟿ ...

其中一个字段是代表源数据库中 "flags" 单词的数字:

#define COURTEOUS     1             /* names changed to protect something */
#define KIND          2
#define FORGIVING     4
#define WITTY         8
#define OBSEQUIOUS   16
#define PURPLE       32
#define HAPPY        64
#define CLAIRVOYANT 128
#define WISE        256
      ...

有人表示,数字可能不是传输此信息的最便捷方式。我目前的想法是 运行 沿着这些思路:

<things>
    <thing>
        <name>blah de blah</name>
        <owner>blargh</owner>
        <flags value='176'>
            <flag>OBSEQUIOUS</flag>
            <flag>PURPLE</flag>
            <flag>CLAIRVOYANT</flag>
        </flags>
            ...
    </thing>
        ...
</things>

这是明智的做法吗?对此有某种标准方法吗? 会这样吗:

        <flags value='176'>
            <OBSEQUIOUS/>
            <PURPLE/>
            <CLAIRVOYANT/>
        </flags>

有进步吗?

谢谢!

标志的语义含义已正确编码在每个标志的名称中。数值只是一个实现细节。您应该在 XML 中仅编码标志名称而不是数值。这保留了语义,而不会将您束缚于特定的实现。

 <flags>
        <OBSEQUIOUS/>
        <PURPLE/>
        <CLAIRVOYANT/>
 </flags>

我更喜欢使用标签来表示结构而不是内容,所以我更喜欢使用您的第一个选项

<flag>OBSEQUIOUS</flag>
<flag>PURPLE</flag>
<flag>CLAIRVOYANT</flag>

如果您使用的是 XML 模式,您可以使用枚举来验证标志字段的值是否在预定义的集合内。然后,该架构作为 XML 格式用户的文档,使有效值明确(如果您在设计架构时确实知道所有可能的值。)。

<xs:simpleType name='Beatle' >
  <xs:restriction base='xs:string' >
    <xs:enumeration value='OBSEQUIOUS' />
    <xs:enumeration value='PURPLE' />
    <xs:enumeration value='CLAIRVOYANT' />
  </xs:restriction>
</xs:simpleType>

正如其他人评论的那样,没有充分的理由同时存储位数组值和标志本身。在某些情况下,您可以仅存储位数组值 ,例如,如果 XML 文件的大小必须保持尽可能小,或者出于性能原因。这会牺牲可读性和可移植性,因此只有在性能值得权衡的情况下才应该这样做。

很大程度上取决于您的设计目标,但我们假设您追求的是清晰度、易于更改、可读性等而不是紧凑性,那么我的选择可能是 space 分隔的列表,喜欢

<flags value="OBSEQUIOUS PURPLE CLAIRVOYANT"/>

架构中描述为

<xs:simpleType name='Beatle' >
  <xs:list>
    <xs:restriction base='xs:string' >
      <xs:enumeration value='OBSEQUIOUS' />
      <xs:enumeration value='PURPLE' />
      <xs:enumeration value='CLAIRVOYANT' />
    </xs:restriction>
  </xs:list>
</xs:simpleType>

我对@JimGarrison 的设计感到不安,但我不确定为什么。我认为这可能与您如何编写模板规则以在 XSLT 中处理它有关。如果你沿着模式感知路线走下去,那么你可以将每个元素声明为替换组 FLAG 的成员,你可以这样写:

<xsl:template match="schema-element(FLAG)">...

但您并不总是希望您的处理是模式感知的。您仍然可以选择

<xsl:template match="flags/*">...

但我认为大多数人更愿意拥有一个元素名称,他们可以直接将其用作处理应用程序的句柄。