【发布时间】:2013-09-08 16:54:37
【问题描述】:
在我的代码中,我有以下类来反序列化 XML:
public abstract class AssetBase
{
[XmlAttribute] public string Name { get; set; }
[XmlAttribute] public float RelativeX { get; set; }
[XmlAttribute] public float RelativeY { get; set; }
[XmlAttribute] public float RelativeZ { get; set; }
[XmlAttribute] public float ScaleX { get; set; }
[XmlAttribute] public float ScaleY { get; set; }
[XmlAttribute] public bool Visible { get; set; }
}
当我使用xsd.exe 为此定义架构时,架构会对其进行设置,因此需要这些属性进行验证。
如何设置此类,以便用户可以将其留空,因为并非所有这些都是强制性的?
编辑: 我只是查看了它生成的 xsd 并看到:
<xs:complexType name="AssetBase" abstract="true">
<xs:attribute name="Name" type="xs:string" />
<xs:attribute name="RelativeX" type="xs:float" use="required" />
<xs:attribute name="RelativeY" type="xs:float" use="required" />
<xs:attribute name="RelativeZ" type="xs:float" use="required" />
<xs:attribute name="ScaleX" type="xs:float" use="required" />
<xs:attribute name="ScaleY" type="xs:float" use="required" />
<xs:attribute name="Visible" type="xs:boolean" use="required" />
</xs:complexType>
我很困惑为什么没有将 Name 设置为必需,但其余的都是...
【问题讨论】:
-
是不是因为
string可以为空而其他类型(float和bool)不是?只是猜测。 -
这是个好主意。不幸的是,xsd.exe 似乎无法处理
float?和bool?属性,因为它在它们上失败了。使用[XmlElement]会生成一个 xsd,但它需要一个列为 nil 的完整元素节点,并且不允许您不指定它:-/ -
您是否尝试过将
[XmlRoot(IsNullable=true)]添加到AssetBase以允许可空类型使用属性正确序列化
标签: c# xml xsd-validation