【问题标题】:Load repetitively-named XML nodes using Linq [C#]使用 Linq [C#] 加载重复命名的 XML 节点
【发布时间】:2009-11-20 18:33:01
【问题描述】:

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

以下代码 sn-p 进入一个构造函数,该构造函数接受参数“字符串名称”,该参数标识要提取的正确 XML &lt;command&gt;

我希望有一个 linq 语句从给定部分名称的 XML 中提取每个 &lt;cvar&gt;,将所有内容转储到 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);
    }

上面的代码sn -p向控制台输出以下内容:

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

【问题讨论】:

    标签: c# xml linq-to-xml


    【解决方案1】:

    应该这样做:

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

    这将为您提供一个IEnumerable&lt;XElement&gt;,其中每个XElement 代表指定命令中的一个cvar

    注意,如果指定的命令不存在,调用Single会报错。同样,如果在命令中找不到指定的属性。

    编辑根据您的 cmets,您可以执行以下操作:

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

    【讨论】:

    • 嗯。所以,我应该把它放在一个 try-catch 中,看看它是否存在?或者我可以调用一种方法来检查该节点上是否存在节点和/或属性?
    • 问题:我现在如何访问属性?
    • cvar 的“名称”和“值”
    • 与我们之前获取其他属性的值的方式相同。答案已更新。
    猜你喜欢
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多