2016-08-30 12 views
0

クラスをシリアル化しようとするとエラーが発生します。 xmlスキーマはサードパーティによって定義されており、変更することはできません。同じ名前で属性が異なる2つのプロパティをシリアル化します

XMLは(のみところでスニペット)を次のようになります。私は私の注文日

[Serializable] 
public class OrderDate 
{ 
    public enum OrderDateTypeEnum 
    { 
     [Description("entered-date")] 
     EnteredDate, 
     [Description("received-date")] 
     ReceivedDate, 
     [Description("required-date")] 
     RequiredDate 
    } 

    private OrderDateTypeEnum _typeEnum; 

    [XmlIgnore] 
    public OrderDateTypeEnum TypeEnum 
    { 
     get { return this._typeEnum; } 
     set 
     { 
      this._typeEnum = value; 
      this.Type = this._typeEnum.GetDescription(); 
     } 
    } 

    [XmlAttribute("type")] 
    public string Type { get; set; } 

    [XmlText] 
    public string Name { get; set; } 
} 

のための次のクラスを定義したと順序クラスは次のように定義されて

<order> 
<date type="received-date">20160810</date> 
<date type="required-date">20160810</date> 
<reference type="cust-order-no">CCCC</reference> 
<reference type="an-2">AAAA</reference> 
<reference type="an-3">BBBB</reference> 
<order> 

[Serializable] 
public class Order 
{ 
    [XmlElement("date")] 
    public OrderDate EnteredDate { get; set; } 

    [XmlElement("date")] 
    public OrderDate ReceivedDate { get; set; } 

    [XmlElement("date")] 
    public OrderDate RequiredDate { get; set; } 
} 

これをシリアル化すると、エラーが発生します。

The XML element 'date' from namespace '' is already present in the current 
scope. Use XML attributes to specify another XML name or namespace for the 
element. 

[XmlElement("date")]を削除すると機能しますが、xmlは必要な方法でフォーマットされていません。

私はそれに触れると、まったく同じ問題が発生します。

この問題を回避するにはどうすればよいですか?

+0

'ReceivedDate'プロパティの' [XmlElement( "date")] 'の代わりに' [XmlElement( "received-date")] 'でなければなりませんか?同じ日付が必要です。 XMLには「EnteredDate」はありません。 – user3185569

+0

@ user3185569、理想的にはyesですが、あなたが提案したことをすれば、そのメモはではなく、これは、私のシナリオではうまくいかないことを覚えているように、私はxmlが第三者から来るように私に提示される形式を変更することはできません。 – Thierry

答えて

1

自分でIXmlSerializableを実装せずにこれを定義しているので、これを実行してOrderにマップすることはできません。

[XmlRoot("order")] 
public class Order 
{ 
    [XmlElement("date")] 
    public List<OrderDate> Dates { get; set; } 
} 

が作動し、デモ用のthis fiddleを参照してください:あなたはどうすることができ、単一List<OrderDate>プロパティを使用しています。あなたは望むならば、さまざまな(無視された)プロパティを追加して各タイプの日付を照会することができます。

脇に、[Serializable]属性は、XmlSerializerとは関係がなく、削除できます。

+0

そのチャールズありがとう。それはリストを使用して動作しますが、私は本当に私はそれがフォーマットされている方法が気に入らないので、私はそのスキーマを変更することができたらいいですね。 – Thierry

関連する問題