为什么xsd.exe生成一个需要所有属性的模式?

时间:2013-09-05 01:41:02

标签: c# xml xsd-validation

在我的代码中,我有以下类来反序列化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不是必需的,但其余的都是......

2 个答案:

答案 0 :(得分:2)

正如您发现自己Nullable<T>并不只是与[XmlAttribute]合作,因为它是一种复杂的类型。你必须使用魔法&#39; property *指定处理此事。

[XmlIgnore]
public float? RelativeX
{
    get { return this.RelativeX; }
    set { this.RelativeX = value; }
}

[XmlAttribute("RelativeX")]
public float RelativeXValue
{
    get { return this.RelativeX.Value; }
    set { this.RelativeX = value; }
}

[XmlIgnore]
public bool RelativeXValueSpecified
{
    get { return this.RelativeX.HasValue; }
}

您的其他选择是:

  • 为所有属性使用字符串,并具有正确类型的相应属性
  • 实施IXmlSerializable

答案 1 :(得分:0)

我找到了这个解释:

  

使用属性:从类

生成XML模式文档      

在以下两种情况之一中,Xsd.exe未指定use属性,还原为默认值optional:

     

•存在遵循指定命名约定的额外公共bool字段。

     

•通过System.ComponentModel.DefaultValueAttribute类型的属性为成员分配默认值。

     

如果这些条件都不满足,则Xsd.exe会为use属性生成一个必需值。

来自this article

我使用默认值方式,它工作正常:)

享受!!!