使用Delphi XML数据绑定向导和XML枚举。

7

我有一个使用枚举的XML模式,在Delphi中查看生成的XML对象时,枚举限制已被删除。有没有办法让Delphi生成枚举并将其构建到对象中?

XSD片段:

<xs:simpleType name="enumType" final="restriction">
    <xs:restriction base="xs:NMTOKEN">
        <xs:enumeration value="Each"/>
        <xs:enumeration value="Units"/>
        <xs:enumeration value="Area"/>
        <xs:enumeration value="Payroll"/>
        <xs:enumeration value="Sales"/>
        <xs:enumeration value="TotalCost"/>
        <xs:enumeration value="Other"/>
    </xs:restriction>
</xs:simpleType>

我希望在Delphi中看到一个接受枚举类型并在生成XML时将其转换为相应字符串的字段,但该字段只是普通字符串。
2个回答

6
你可以创建自己的枚举类型,并使用与名称相同的字符串常量,使用TypInfo单元中的GetEnumValue和GetEnumString函数。这样,你就可以像其他Delphi代码一样在名称前加上几个小写字母:
Value :=  TMyEnum( GetEnumValue( typeinfo( TMyEnum ), Prefix + AString )  )

如果你有一个枚举类型,例如TMyEnum = (meFirst, meSecond, meThird),你可以使用EnumValue := TMyEnum(GetEnumValue(typeinfo(TMyEnum), 'meFirst'));来获取序数(数字)值;结果将是meFirst。另一种方法:Result := Copy(GetEnumName(typeinfo(TMyEnum), Ord(meSecond)), 3, MaxInt)将产生字符串“Second”。需要注意的是,如果GetEnumValue未找到该值,则返回-1,因此您可能需要对结果进行额外的测试,而不是直接将其转换为枚举类型。祝好运! - Ritsaert Hornstra

3
XML数据绑定向导无法实现您想要的功能。原因是XSD中的枚举与Delphi标识符不兼容,因为它们:
  1. 可能包含与Delphi标识符不兼容的字符
  2. 区分大小写
基本上,XSD枚举只是具有值约束的字符串。请参见枚举规范示例。两者都明显与Delphi枚举类型不兼容。编辑:20100125- Delphi属性。这里有一个有趣的问题,涉及Delphi 2010中新属性和RTTI支持的限制。--jeroen

1
这些对我来说听起来像是借口(当然不是你,决定不支持Delphi中的XML枚举的人)。有许多解决方案可以解决这个问题,实际上枚举必须存储在字符串常量中,没有理由需要一个enumType。每个选项...对我来说都是enumType_enums_Each。感谢确认。 - LostNomad311
1
通过当前的语言特性(属性、常量),可能可以解决这个问题。但请记住,Delphi 在这种限制方面并不孤单。从 XSD 模式生成包装器是专业工具领域,即使在 Java 或 .NET 世界中也是如此。在这里查看一些在 .NET 世界中工作的工具答案:https://dev59.com/2UXRa4cB1Zd3GeqPu9JF - Jeroen Wiert Pluimers
谢谢,已经加入到delicious中了...有一种感觉告诉我以后会需要它。 - LostNomad311
1
还有很多东西是行不通的。基本上,XSD允许使用非常难以(如果不是不可能)映射到大多数编程语言的数据结构。例如,在XSD中,您可以通过两种方式从现有类型派生:扩展它和限制它。面向对象的语言只允许在派生时进行扩展。 - Jeroen Wiert Pluimers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接