C# 使用Linq[C]加载重复命名的XML节点
我正在开发一个需要能够从XML文件加载对象属性的程序。这些属性可由用户配置,使用XML对我来说很有意义 以下面的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 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的名称和值与我们之前获取其他属性值的方式相同。答案已更新。