LINQ to XML 查询不返回任何结果

Posted

技术标签:

【中文标题】LINQ to XML 查询不返回任何结果【英文标题】:LINQ to XML query doesn't return any results 【发布时间】:2021-06-02 15:25:05 【问题描述】:

我正在尝试查询 XML 树并将结果元素值存储在类似于this example 的对象列表中。

问题是无论我尝试什么,我都无法填充列表。我没有任何错误,我只有一个空列表。我几乎可以肯定我的查询设置错误,但我是 LINQ 的新手,我不知道我哪里出错了。这是我正在使用的课程:

public class Individual

    public string field1  get; set; 
    public string field2  get; set; 
    public bool field3  get; set; 

这是我的变量和查询:

XDocument xmlDoc = XDocument.Load(new System.IO.StringReader(MainDataSource.CreateNavigator().OuterXml));

xmlDoc.Descendants()
    .Attributes()
    .Where(x => x.IsNamespaceDeclaration)
    .Remove();

List<Individual> individualList =
    (
        from el in xmlDoc.Root.Elements("myFields").Descendants("Individual")
        select new Individual
        
            field1 = (string)el.Element("field1"),
            field2 = (string)el.Element("field2"),
            field3 = (bool)el.Element("field3")
        
    ).ToList();

这是 XML 文档:

<?mso-infoPathSolution solutionVersion="1.0.0.31" productVersion="15.0.0" PIVersion="1.0.0.0" href="file:///C:\Users\User\AppData\Local\Microsoft\InfoPath\Designer4\991d50f99c274f7c\manifest.xsf" ?>
<?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.4"?>
<myFields xml:lang="en-us" xmlns="http://schemas.microsoft.com/office/infopath/2003/myXSD/2021-02-26T15:29:19">
  <DirectReportsList>
    <Individual>
      <field1>foo</field1>
      <field2>bar</field2>
      <field3>true</field3>
    </Individual>
  </DirectReportsList>
  <Current_UserID></Current_UserID>
  <Current_UserName></Current_UserName>
</myFields>

【问题讨论】:

@Crowcoder 好吧,我在某种程度上已经尝试过了。但我在添加删除命名空间声明位之前尝试过。尽管显然这会删除除一个名称空间之外的所有名称空间。我宁愿根本没有任何命名空间要处理;为什么我的代码没有删除最后一个命名空间? 不,您的代码实际上并未删除命名空间。如果你调试,你可以看到。另一个问题是 myFields 是根目录,因此您无法从根目录导航到 myFields 到其他位置。 【参考方案1】:

您的代码正在根目录下寻找 myFields 元素,但那是根目录,所以没有找到。

这是你可以做的:

XNamespace ns ="http://schemas.microsoft.com/office/infopath/2003/myXSD/2021-02-26T15:29:19";
        
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")
        
    ).ToList();

如果你真的不想处理命名空间,你可以使用元素的 LocalName 但是它对于意外的 xml 内容很脆弱。

更新

我刚刚查看了您链接到的示例。不行,作者贴了不好的代码。

【讨论】:

谢谢!我试过你的建议,确实有错误。这段代码可以挽救还是我应该废弃它? 如果这就是你所需要的就好了 我不明白你在说什么。如果代码不起作用,那我需要什么? 我答案中的代码有效,你能用吗? 哦,我现在明白了。不,我所指的错误是在您的答案中使用代码时引发的; Value cannot be null.

以上是关于LINQ to XML 查询不返回任何结果的主要内容,如果未能解决你的问题,请参考以下文章

LINQ 方法的问题不返回任何结果

结果为空时LINQ返回啥

具有多个包含的Linq-to-Sql

即使使用 DefaultIfEmpty,Linq 查询也不返回预期结果

返回 LINQ 查询结果的控制器方法

有没有更快的方法来检查 LINQ to XML 中的 XML 元素?