LINQ to XML查询XML树无返回,无法填充Individual对象列表
问题根因排查
两个核心问题直接导致查询永远返回空列表:
1. 未处理XML默认命名空间,导致元素匹配完全失效
你的XML根节点<myFields>带了微软InfoPath固有的默认命名空间:xmlns="http://schemas.microsoft.com/office/infopath/2003/myXSD/2021-02-26T15:29:19"
XLinq在匹配元素时,是严格按照**元素完整名称(命名空间+本地标签名)**做精确匹配的,不是只看标签的字面文字。你直接写Elements("myFields"),本质是在查找「不带任何命名空间、本地名称为myFields」的节点,和实际带命名空间的myFields节点完全不匹配,后续所有查询链路自然拿不到任何结果。
你之前写的删除命名空间属性的代码完全无效:这段代码只会把xmlns开头的属性从节点上移除,但XDocument在加载XML时,已经把每个元素对应的命名空间信息缓存到元素对象内部了,事后删属性不会改变元素本身的命名空间关联,匹配逻辑还是不生效。
2. 查询路径逻辑错误,找错了节点层级
就算解决了命名空间问题,你当前的查询路径也是错的:
xmlDoc.Root本身就是那个<myFields>节点,它的直接子节点是DirectReportsList、Current_UserID这类内容,根本不存在一个叫myFields的子节点。你写的xmlDoc.Root.Elements("myFields")相当于从myFields根节点出发,找它名字也叫myFields的子节点,这层匹配从逻辑上就不可能成功。
可用的修正后代码
完全不需要手动删命名空间属性,直接提取内置的命名空间变量,顺着正确的层级匹配即可:
XDocument xmlDoc = XDocument.Load(new System.IO.StringReader(MainDataSource.CreateNavigator().OuterXml)); // 直接从根节点读取关联的默认命名空间,不要手动硬编码字符串 XNamespace ns = xmlDoc.Root.Name.Namespace; List<Individual> individualList = ( from el in xmlDoc.Root.Descendants(ns + "Individual") select new Individual { field1 = (string)el.Element(ns + "field1"), field2 = (string)el.Element(ns + "field2"), // 这里加个空值兜底,避免节点缺失时报空引用错误 field3 = (bool?)el.Element(ns + "field3") ?? false } ).ToList();
补充说明
- 所有给
Element()、Descendants()方法传的名称参数,都需要拼接对应的命名空间,不能只传本地标签名 - 用
Descendants("Individual")直接全层级匹配目标节点即可,不需要把完整节点路径写死,后续XML结构调整了也不用频繁改查询代码 - InfoPath导出的XML默认都会携带这个固定的命名空间,属于平台正常行为,不需要手动清除
内容的提问来源于stack exchange,提问作者ARich
相关产品推荐
相关产品推荐

