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/*">...
但我认为大多数人更愿意拥有一个元素名称,他们可以直接将其用作处理应用程序的句柄。
在 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/*">...
但我认为大多数人更愿意拥有一个元素名称,他们可以直接将其用作处理应用程序的句柄。