LINQ查询XML节点返回Null求助:按子节点值筛选父节点失败
问题根源:XML命名空间没处理!
嘿,我一眼就看出你踩坑的原因啦——你的XML文档声明了默认命名空间 http://api.some.com/version/1,但你所有的查询代码都完全没考虑这个命名空间,导致程序根本找不到对应的节点,所以才一直返回null。
先搞懂为什么会这样
XML里的<SalesQuotes>节点带了xmlns="http://api.some.com/version/1",这意味着它下面的所有子节点(包括<SalesQuote>、<Guid>等)都默认属于这个命名空间。而你用Elements("SalesQuote")这种写法,只会查找没有命名空间的<SalesQuote>节点,自然匹配不到任何结果。
解决方案:带上命名空间查询
只需要先定义命名空间变量,然后在所有元素查询时带上它就行:
var contents = File.ReadAllText(path: "test1.xml"); var doc = XDocument.Parse(contents); // 第一步:定义XML的命名空间 XNamespace ns = "http://api.some.com/version/1"; var root = doc.Root; // 修正第一个查询:找到所有SalesQuote节点 var sq = root.Elements(ns + "SalesQuote"); // 修正第二个查询:找到Guid匹配的SalesQuote节点 var theQuote = root.Elements(ns + "SalesQuote") .Where(el => el.Element(ns + "Guid").Value == "825634b9-28f5-4aa7-98e7-5e4a4ed6bc6a"); // 修正第三个查询:找到Guid匹配的父节点SalesQuote(优化写法) var theAlternativeQuote = from el in doc.Descendants(ns + "Guid") where el.Value == "825634b9-28f5-4aa7-98e7-5e4a4ed6bc6a" select el.Parent;
额外小提示
如果你的XML里有多个命名空间,只需要分别定义对应的XNamespace变量即可。另外,用Element(ns + "Guid")的时候最好加个空值判断,避免节点不存在时抛出NullReferenceException,比如:
.Where(el => el.Element(ns + "Guid")?.Value == "825634b9-28f5-4aa7-98e7-5e4a4ed6bc6a");
内容的提问来源于stack exchange,提问作者Isaac L
相关产品推荐
相关产品推荐

