gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:52:17 25 4
gpt4 key购买 nike

我正在开发一个需要能够从 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-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>

最佳答案

应该这样做:

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 );
}
}

关于c# - 使用 Linq [C#] 加载重复命名的 XML 节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1772421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com