2016-08-30 2 views
0

Я получаю сообщение об ошибке при попытке сериализации моего класса. Схема xml определяется сторонней, и я не могу ее изменить.Serialize 2 свойства с тем же именем, но разные атрибуты

XML-выглядит следующим образом (фрагмент только кстати):

<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 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; } 
} 

и класс порядок определяется как:

[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

Не должно быть '[XmlElement (" дата-дата ")]' вместо '[XmlElement (" date ")]' для свойства 'ReceivedDate'? То же самое касается требуемой даты. И я не вижу 'EnteredDate' в вашем XML. – user3185569

+0

@ user3185569, в идеале да, но если вы сделаете то, что предложили, примечание не будет , но вместо этого оно будет <получено-date type = "received-date" /> что нехорошо в моем сценарии, поскольку помните, что я не могу изменить формат, в котором xml представлен мне, поскольку он исходит от стороннего. – Thierry

ответ

1

Вы не можете сделать это и сопоставить с Order, как вы его определили, не внедрив IXmlSerializable. Что вы можете сделать, это использовать один List<OrderDate> свойство:

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

См this fiddle для рабочей демонстрации. Вы можете добавить различные (проигнорированные) свойства для запроса дат для каждого типа, если хотите.

Как в стороне, атрибут [Serializable] не имеет ничего общего с XmlSerializer и может быть удален.

+0

Спасибо за то, что Чарльз. Он работает с использованием списка, но я действительно хочу, чтобы я мог изменить эту схему, поскольку мне действительно не нравится способ ее форматирования. – Thierry

Смежные вопросы