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

C# LINQ to XML查询不返回任何结果,c#,xml,list,linq,linq-to-xml,C#,Xml,List,Linq,Linq To Xml,我试图查询一个XML树,并将结果元素值存储在一个类似于的对象列表中 问题是,无论我尝试什么,我都无法填充列表。我没有任何错误,我只是有一个空的列表。我几乎可以肯定我的查询设置是错误的,但我是LINQ的新手,不知道哪里出了错。下面是我正在使用的类: public class Individual { public string field1 { get; set; } public string field2 { get; set; } public bool field3

我试图查询一个XML树,并将结果元素值存储在一个类似于的对象列表中

问题是,无论我尝试什么,我都无法填充列表。我没有任何错误,我只是有一个空的列表。我几乎可以肯定我的查询设置是错误的,但我是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>

您的代码正在根目录下查找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内容很脆弱

更新


我刚才看了你链接到的例子。它不起作用,作者发布了错误的代码。

@Crowcoder嗯,我在某种程度上尝试过。但在添加remove名称空间声明位之前,我尝试过这样做。尽管很明显,除了一个名称空间之外,这会删除所有名称空间。我宁愿根本不处理任何名称空间;为什么我的代码不删除最后一个名称空间?不,您的代码实际上没有删除名称空间。如果调试,您可以看到这一点。另一个问题是myFields是根目录,因此您无法从根目录导航到myFields,也无法导航到其他目录。谢谢!我试过你的建议,但确实有一个错误。这段代码是可以挽救的还是我应该放弃它?如果这是你需要的就好了我不明白你在说什么。如果代码不起作用,那我需要什么呢?我答案中的代码起作用了,你能用吗?哦,我现在明白了。不,我所指的错误是在使用您答案中的代码时抛出的;值不能为null。