XElement明确支持转换为Nullable< int>但它没有像我预期的那样工作。以下单元测试演示了该问题:
[TestMethod]
public void CastingNullableInt()
{
var xdoc = XDocument.Parse("<root xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><okay>123</okay><boom xsi:nil=\"true\"/></root>");
Assert.AreEqual(123, (int?)xdoc.Root.Element("okay"));
Assert.IsNull((int?)xdoc.Root.Element("boom"));
}
测试应该通过最后一个断言。相反,它提供FormatException
:
输入字符串的格式不正确。
为什么不在这里正确解析null
?
答案 0 :(得分:1)
Linq to XML不支持模式,因此它不会将xsi:nil = "true"
转换为可以为空的变量。要测试这个,您需要执行以下操作:
Assert.IsTrue((bool?)xdoc.Root.Element("boom").Attribute("{http://www.w3.org/2001/XMLSchema-instance}nil") == true);
答案 1 :(得分:0)
XElement
无法正确解析<boom xsi:nil=\"true\"/>
。它仅在您省略<boom xsi:nil=\"true\"/>
时才有效,然后值为null
并返回(int?)null
。
解决方法可能是首先检查值是否为空:
!string.IsNullOrEmpty((string)xdoc.Root.Element("boom"))
? (int?)xdoc.Root.Element("boom")
: null
;
答案 2 :(得分:0)
您可以查看IsEmpty
属性:
var value = xdoc.Root.Element("boom").IsEmpty ? null : (int?)xdoc.Root.Element("boom");