C# 如何在不存在空异常的情况下使用linq2Xml?
我编写了这个简单的linq到xml查询,使用linq语法似乎无法避免null异常。我用错了吗?正确的(简短的)Linq2Xml语法应该是什么 linq2Xml查询 XMLC# 如何在不存在空异常的情况下使用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值或所用类型的默认值
用户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无法访问您的数据,因此它强调了一个事实,即如果没有结果,它将生成空引用异常
您可以执行以下三项操作之一:
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);