пытается десериализовать строку 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, может иметь нулевой тип, мне необходимо явно определить соответствующий тип данных как обнуляемый.Я очень доволен этим, а не моим текущим решением.