将简单的XSD用户定义的简单类型映射到A .net类

时间:2011-05-16 22:04:25

标签: c# serialization xsd

我有一个使用xsd.exe生成的XSD,然后在xsd上创建了一个类。一切都很好,但有些元素有共同的业务规则。例如,我们的xml中的所有金额都表示为没有小数,因此3.94 $变为394.我创建了一个xml简单类型来表示以这种方式定义的所有属性,但是还没有弄清楚如何映射xsd类型为.net类,可以处理数据如何存储在xml中的业务逻辑。我以前创建了复杂类型,但不是在属性中使用的简单类型可以指向我在正确的目录中

非常简化的XML剪辑

<Check amt="356" >
   <LNItem amt="123" />
   <LNItem amt="223" />
</Check> 

我想要一个像下面这样的课程。

[XmlType(Check)]
public     
{
    AmtType Amt {get;set}

}

2 个答案:

答案 0 :(得分:1)

你必须做这样的事情:

partial class Check
{
    internal const decimal ScaleFactor = 0.01m;

    private decimal amount;

    [XmlAttribute("Amt")]
    public decimal XmlAmount
    {
        get { return decimal.Round(amount / ScaleFactor); }
        set { amount = value * ScaleFactor; }
    }

    [XmlIgnore]
    public decimal Amount
    {
        get { return amount; }
        set { amount = value; }
    }
}

请注意,将decimal除以小于零的比例因子非常重要:它会从decimal表示中删除小数位,而乘以其倒数则不会。换句话说:

Console.WriteLine(3.94m / 0.01m); // prints "394"
Console.WriteLine(3.94m * 100m);  // prints "394.00"

答案 1 :(得分:0)

这应该这样做:

[XmlRoot(Check)]
public class Check    
{  
    [XmlElement("LNItem")]
    public List<LNItem> LNItems { get; set; }
}

[XmlRoot(LNItem)]
public class LNItem
{
    [XmlAttribute("amt")]
    public AmtType Amt { get; set; }
}