将XElement转换为int?指定xsi:nil =“true”时失败

时间:2016-03-15 15:32:43

标签: c# xml linq-to-xml

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

3 个答案:

答案 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");