C# 使用Linq[C]加载重复命名的XML节点

C# 使用Linq[C]加载重复命名的XML节点,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,我正在开发一个需要能够从XML文件加载对象属性的程序。这些属性可由用户配置,使用XML对我来说很有意义 以下面的XML文档为例 <?xml version="1.0" encoding="utf-8" ?> <udpcommands> <command name="requser"> <cvar name="reqchallege" value="false" /> </command> <command

我正在开发一个需要能够从XML文件加载对象属性的程序。这些属性可由用户配置,使用XML对我来说很有意义

以下面的XML文档为例

<?xml version="1.0" encoding="utf-8" ?>

<udpcommands>

  <command name="requser">
    <cvar name="reqchallege" value="false" />
  </command>

  <command name="reqprocs">
    <cvar name="reqchallenge" value="false" />
  </command>

</udpcommands>
我需要能够将上述CVAR中的值加载到属性。我认为Linq到XML会很好,我正在寻找Linq的应用程序,以便学习它。我已经完成了一个Linq到XML的查询,以便根据名称选择正确的命令。我正在阅读相关帮助

下面的代码段位于一个构造函数中,该构造函数采用参数字符串名称,该名称标识要提取的正确XML

我希望有一个linq语句,在给定节名的情况下从XML中提取每一条语句,将所有内容转储到IEnumerable。或者,我正在寻找一个更好的选择。我什么都愿意。我只想使用Linq,以便更好地学习它

    XElement doc = XElement.Load("udpcommands.xml");

    IEnumerable<XElement> a = from el in doc.Elements()
                              where el.FirstAttribute.Value == name
                              select el;

    foreach (var c in a)
    {
        Console.WriteLine(c);
    }
上述代码段将以下内容输出到控制台:

<command name="requser">
  <cvar name="reqchallege" value="false" />
</command>

这样做应该可以:

var result = 
    doc.Elements("command")
    .Single( x => x.Attribute("name").Value == name)
    .Elements("cvar");
这将为您提供一个IEnumerable,其中每个XElement表示指定命令中的cvar

请注意,如果指定的命令不存在,则对Single的调用将导致错误。同样,如果在命令上找不到指定的属性

根据您的评论进行编辑,您可以按照以下方式进行操作:

// Result will be an XElement, 
// or null if the command with the specified attribute is not found
var result = 
    doc.Elements("command")
    // Note the extra condition below
    .SingleOrDefault( x => x.Attribute("name")!=null && x.Attribute("name").Value == name)

if(result!=null)
{
    // results.Elements() gives IEnumerable<XElement>
    foreach(var cvar in results.Elements("cvar"))
    {
        var cvarName = cvar.Attribute("name").Value;
        var cvarValue = Convert.ToBoolean( cvar.Attribute("value").Value );
    }
}

嗯,那么,我应该把这个放在试捕器里,看看它是否存在?或者我可以调用一种方法来检查节点和/或属性是否存在于该节点上?问题:我现在如何访问属性?cvar的名称和值与我们之前获取其他属性值的方式相同。答案已更新。