Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在不存在空异常的情况下使用linq2Xml?_C#_Linq To Xml - Fatal编程技术网

C# 如何在不存在空异常的情况下使用linq2Xml?

C# 如何在不存在空异常的情况下使用linq2Xml?,c#,linq-to-xml,C#,Linq To Xml,我编写了这个简单的linq到xml查询,使用linq语法似乎无法避免null异常。我用错了吗?正确的(简短的)Linq2Xml语法应该是什么 linq2Xml查询 XML 用户1 123 用户2 456 999 使用单个意味着您希望正好有一个结果。当返回更多结果时,Single将抛出异常。您可以使用First获取第一项,或者使用Last获取最后一项。对于多个项目,您将希望在结果上循环并单独访问每个项目 如果不存在匹配结果,可以使用SingleOrDefault返回null值或所用类型的默认值

我编写了这个简单的linq到xml查询,使用linq语法似乎无法避免null异常。我用错了吗?正确的(简短的)Linq2Xml语法应该是什么

linq2Xml查询 XML

用户1
123
用户2
456
999

使用
单个
意味着您希望正好有一个结果。当返回更多结果时,Single将抛出异常。您可以使用
First
获取第一项,或者使用
Last
获取最后一项。对于多个项目,您将希望在结果上循环并单独访问每个项目

如果不存在匹配结果,可以使用
SingleOrDefault
返回
null
值或所用类型的默认值

queryUserResponseData
是XElement还是XDocument?如果是XDocument,则需要首先访问XML的根,例如:

var userData = queryUserResponseData.Root.Elements("user")
                 .Single(u => u.Element("username").Value == userName);
除此之外,在示例中搜索User1或User2也可以。但是,如果搜索不存在的User3,Single将抛出异常。在这种情况下,应使用SingleOrDefault:

var userData = queryUserResponseData.Elements("user")
                 .SingleOrDefault(u => u.Element("username").Value == "User3");

XElement和XAttribute具有一些显式转换运算符,用于将其值转换为特定类型。它们非常有用,因为当元素或属性丢失时,返回null

var userData = queryUserResponseData.Elements("user").Single(u => (string)u.Element("username") == userName);

根据您对Ahmad答案的评论,我假设当元素没有节点时,您会得到NullReferenceException。你可以这样修理它-

var userData =
    doc.Elements("user")
    .Single(u => u.Element("username") != null && u.Element("username").Value == userName);

但是,如果DTD或XSD需要username节点,或者您确定所有元素都有username节点,您可以忽略ReSharper警告。

从您对Ahmad Maged答案的评论中:

问题实际上出现在
u.Element(“username”).Value
中,其中Resharper通知我可能存在空异常

听起来你可能在担心一个潜在的问题,而不是真正的问题。您知道,您的数据将意味着您将始终返回1个结果,但是ReSharper无法访问您的数据,因此它强调了一个事实,即如果没有结果,它将生成空引用异常

您可以执行以下三项操作之一:

  • 忽略警告,什么也不做

  • 重新编码以说明这一点,这样就不会出现异常(请参阅其他答案)

  • 将Linq封装在
    try{}catch{}
    中,这样如果发生“不可想象的”情况,您的程序就不会崩溃


  • 只有你才能真正决定你想做什么。

    我确实希望有一个结果。问题实际上出现在
    u.Element(“username”).Value
    上,此时Resharper会通知我可能存在空异常。Resharper可能很谨慎,并指出“username”元素可能不存在,在这种情况下会发生异常。见下文@ChrisF的回复@Matajon的答案也是一种避免它的干净方法。
    (string)u.Element(“username”)
    的+1。如果有一些额外的解释为什么/如何解决这个问题,答案将是完美的。@dtb感谢您的支持,并对缺乏解释表示抱歉。
    var userData = queryUserResponseData.Elements("user").Single(u => (string)u.Element("username") == userName);
    
    var userData = queryUserResponseData.Elements("user")
        .Select(u => u.Element("username"))
        .Where(uNode => uNode != null)
        .Single(uName => uName.Value == userName);
    
    var userData =
        doc.Elements("user")
        .Single(u => u.Element("username") != null && u.Element("username").Value == userName);