4

私は、XML 要求/応答を使用する API へのインターフェースを実装するように割り当てられました。API プロバイダーは、XML 呼び出し用の xsd を提供しません。

xsd.exe を使用して C# クラスを生成しました。

すべてのリクエスト/レスポンスに対応するクラスを手動で作成する必要がありますか? これは、後でコードを簡単に維持するのに役立つ場合があります。または、.Net によって提供される Xml クラスを使用し、メソッドを記述して XML 要求/応答を作成する必要がありますか? 時間はかかりませんが、メンテナンス フェーズでは難しくなる可能性があります。

以下は、対応する XML 要素用に作成したサンプル クラスです。

XML 要素

<Product ID="41172" Description="2 Pers. With Breakfast" NonRefundable="YES" StartDate="2010-01-01" EndDate="2010-06-30" Rate="250.00" Minstay="1" />

対応クラス

internal class ProductElement : IElement
{
    private const string ElementName = "Product";

    private const string IdAttribute = "ID";
    private const string DescriptionAttribute = "Description";
    private const string NonRefundableAttribute = "NonRefundable";
    private const string StartDateAttribute = "StartDate";
    private const string EndDateAttribute = "EndDate";
    private const string RateAttribute = "Rate";
    private const string MinStayAttribute = "Minstay";

    private string Id { get; private set; }
    internal string Description { get; private set; }
    internal bool IsNonRefundable { get; private set; }

    private DateRange _dateRange;
    private string ParseFormat = "yyyy-MM-dd";
    private decimal? _rate;
    private int? _minStay;

    internal ProductElement(string id, DateRange dateRange, decimal? rate, int? minStay)
    {
        this.Id = id;
        this._dateRange = dateRange;
        this._rate = rate;
        this._minStay = minStay;
    }
    internal ProductElement(XElement element)
    {
        this.Id = element.Attribute(IdAttribute).Value;
        this.Description = element.Attribute(DescriptionAttribute).Value;
        this.IsNonRefundable = element.Attribute(NonRefundableAttribute).Value.IsEqual("yes") ? true : false;
    }

    public XElement ToXElement()
    {
        var element = new XElement(ElementName);
        element.SetAttributeValue(IdAttribute, _id);
        element.SetAttributeValue(StartDateAttribute, _dateRange.Start.ToString(ParseFormat, CultureInfo.InvariantCulture));
        element.SetAttributeValue(EndDateAttribute, _dateRange.End.ToString(ParseFormat, CultureInfo.InvariantCulture));
        element.SetAttributeValue(RateAttribute, decimal.Round(_rate.Value, 2).ToString());
        element.SetAttributeValue(MinStayAttribute, _minStay.Value.ToString());

        return element;
    }
}

時々、私はあまりにも多くの痛みを感じていると思います. 時々、その痛みは取る価値があると思います。みなさん、どう思いますか?また、クラスの設計に改善はありますか?

4

1 に答える 1

3

あなたは本当に問題を考えすぎています...System.Xml.Serialization名前空間を使用して、時間を本当に節約し、ほとんどの作業を行うことができます。

代わりにこれを使用してください:

public class Product
{
    [XmlAttribute()]
    public long Id { get; set; }
    [XmlAttribute()]
    public string Description { get; set; }
    [XmlAttribute()]
    public string NonRefundable { get; set; }
    [XmlAttribute()]
    public string StartDate { get; set; }
    [XmlAttribute()]
    public string EndDate { get; set; }
    [XmlAttribute()]
    public decimal Rate { get; set; }
    [XmlAttribute()]
    public bool Minstay { get; set; }
}

テストするコードは次のとおりです。

class Program
{
    static void Main(string[] args)
    {
        string xml = "<Product ID=\"41172\" Description=\"2 Pers. With Breakfast\" NonRefundable=\"YES\" StartDate=\"2010-01-01\" EndDate=\"2010-06-30\" Rate=\"250.00\" Minstay=\"1\" />";
        XmlSerializer ser = new XmlSerializer(typeof(Product));

        using(MemoryStream memStream = new MemoryStream())
        {
            byte[] data = Encoding.Default.GetBytes(xml);
            memStream.Write(data, 0, data.Length);
            memStream.Position = 0;
            Product item = ser.Deserialize(memStream) as Product;
            Console.WriteLine(item.Description);
        }
    }
}

最後に、日付などの変換で過度に凝ったことは何もしていないことに気付くでしょうが、追加の詳細については簡単に拡張できます。ここから取り除かなければならない主なことは、このすべてを本当に考えすぎているということです。

于 2012-06-19T13:23:57.203 に答える