尝试反序列化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;}
}
似乎
XML中的的xsi:无= “真”
属性应该可以解决我的问题。但是我们正在使用REST服务器提供的XML作为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字符串中有很多null元素,而且另一方可以修复它们的XML,因此在这种情况下我不需要对我的反序列化代码做任何事情吗?
无论如何,我可以在反序列化之前在代码中执行某些操作,因此XML可以为null元素提供正确的xsi:nil =“true”属性,这样我就不需要在C#代码中做很多事情,但可以快速修复它们的XML ?
我正在考虑@Ryan在第二局的解决方案:deserialize-xml-with-empty-elements-in-c,但不确定是否有更好的解决方案?
编辑:
刚做了一个小测试,在XML中添加xsi:nill ='true'null元素确实可以使用我现有的C#代码。 但我确实需要确保从XML映射的C#类对于那些来自XML的带有xsi:nill ='true'的null元素具有可空的数据类型。但它有意义:当来自XML的某些数据字段可能是空类型时,我需要将对应的数据类型显式定义为可空。我对此感到非常满意,而不是我目前的解决方案。
答案 0 :(得分:0)
我不知道你的问题的答案,但在我看来,要求你的同事修复他们的XML并不是正确的答案。将网络和文件格式代码编写为“在你所提供的内容中保守,但在接受的内容中接受”或其他一些代码时,这是常识。
也就是说,您应该准备好接收传入XML流中的任何内容。如果XML格式正确并包含您需要的元素和属性,那么您应该能够正确地解析它。如果它包含您不允许的元素,则应优雅地忽略它们或引发错误条件。如果XML格式不正确,则应该引发错误。
否则,如果来自另一端的错误,您的程序将不会很强大,并且可能存在安全漏洞。