2009-11-20 52 views
2

我正在研究一个需要能够从XML文件加载对象属性的程序。这些属性可由用户配置,XML对我来说是有意义的。使用Linq加载重复命名的XML节点[C#]

取下面的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> 

我需要能够从上面cvars的属性加载值。我认为Linq-To-XML对它会有好处(我正在寻找Linq的应用程序,所以我可以学到它)。我已经完成了一个Linq-to-XML查询来根据名称选择正确的“命令”。我正在阅读MSDN寻求帮助。

以下代码片段出现在构造函数中,该构造函数使用参数“字符串名称”来标识要提取的正确XML <command>

我希望有一个linq语句将每个<cvar>从给出段名称的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> 

回答

2

像这样的东西应该做的:

var result = 
    doc.Elements("command") 
    .Single(x => x.Attribute("name").Value == name) 
    .Elements("cvar"); 

这会给你一个IEnumerable<XElement>每个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); 
    } 
} 
+0

OMG。谢谢! :D :)对我也有意义 – Zack 2009-11-20 18:52:27

+0

嗯。所以,我应该试试看,看看它是否存在?或者是否有我可以调用的方法来检查该节点上是否存在节点和/或属性? – Zack 2009-11-20 18:56:38

+0

问题:我现在如何访问属性? – Zack 2009-11-20 19:30:58