XML десериализует нулевые элементы? - PullRequest
1 голос
/ 29 августа 2011

пытается десериализовать строку XML, но всегда возникает проблема для таких элементов:

<Taxable />
<DefaultPurchasePrice />

Мой фрагмент кода C #:

[XmlRoot(ElementName = "Product", Namespace = "http://api.test.com/version/1", IsNullable = false)]
public class Product
{
    public Guid Guid { get; set; }
    public string ProductName { get; set; }
    public bool Taxable { get; set; }
    public Decimal DefautSellPrice { get; set; }
    [XmlElement("DefaultPurchasePrice")]
    public string DefaultPurchasePriceElement
    {
        get
        {
            if (DefaultPurchasePrice == null)
                return String.Empty;
            else
                return DefaultPurchasePrice.ToString();
        }
        set
        {
            if (value == null | value.Length == 0)
                DefaultPurchasePrice = null;
            else
                DefaultPurchasePrice = Convert.ToDecimal(value);
        }
    }

    [XmlIgnore]
    public decimal? DefaultPurchasePrice{ get; set;}
}

Похоже на

xsi: nil = "true"

атрибут в XML должен решить мою проблему.Но так как мы используем XML, предоставленный сервером REST, как часть тестирования API.Мы не имеем прямого контроля над созданием XML, но мы можем дать им обратную связь.Поэтому я думаю, что я должен явно попросить их исправить их XML, так как это проблема их XML, верно?

В то же время я мог бы десериализовать отдельные элементы с помощью следующего кода:

[XmlElement("DefaultPurchasePrice")]
public string DefaultPurchasePriceElement
{
    get
    {
        if (DefaultPurchasePrice == null)
             return String.Empty;
        else
             return DefaultPurchasePrice.ToString();
     }
     set
     {
         if (value == null | value.Length == 0)
              DefaultPurchasePrice = null;
         else
              DefaultPurchasePrice = Convert.ToDecimal(value);
      }
  }

[XmlIgnore]
public decimal? DefaultPurchasePrice{ get; set;}

Но в XML-строке довольно много нулевых элементов, и, опять же, другая сторона может исправить свой XML, так что мне не нужно ничего делать с моим десериализованным кодом в этом случае, верно?

В любом случае,Могу ли я сделать что-то в своем коде перед десериализацией, чтобы XML мог иметь надлежащий атрибут xsi: nil = "true" для нулевых элементов, чтобы мне не нужно было много делать в моем коде C #, но я мог быстро исправить их XML?

Я думаю о решении @ Райана во 2-м последнем отсюда: deserialize-xml-with-empty-elements-in-c , но не уверен, что есть лучшие решения?

РЕДАКТИРОВАТЬ:

Только что сделал небольшой тест, добавив xsi: nill = 'true' в нулевые элементы XML, действительно будет работать с моим существующим кодом C #.Но мне нужно убедиться, что мой класс C #, отображаемый из XML, имеет обнуляемый тип данных для тех нулевых элементов, пришедших из XML с xsi: nill = 'true'.Но это имеет смысл: когда какое-то поле данных, полученное из XML, может иметь нулевой тип, мне необходимо явно определить соответствующий тип данных как обнуляемый.Я очень доволен этим, а не моим текущим решением.

1 Ответ

0 голосов
/ 29 августа 2011

Я не знаю ответа на вашу проблему, но мне кажется, что просить ваших коллег исправить их XML - не правильный ответ. При написании кода сетевого и файлового формата принято считать «будьте консервативны в том, что вы даете, но принимайте в том, что вы получаете», или что-то подобное.

То есть вы должны быть готовы к получению почти НИЧЕГО во входящем потоке XML. Если XML правильно сформирован и содержит требуемые элементы и атрибуты, вы сможете правильно его проанализировать. Если в нем есть элементы, которые вы не разрешаете, вы должны либо игнорировать их, либо выдавать сообщение об ошибке. Если XML не правильно сформирован, вы должны вызвать ошибку.

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

...