Linq to XML 从 config.xml 选择节点(Lambda 表达式或经典查询)

Posted

技术标签:

【中文标题】Linq to XML 从 config.xml 选择节点(Lambda 表达式或经典查询)【英文标题】:Linq to XML select node from config.xml (Lambda expression or classic query) 【发布时间】:2015-10-19 08:58:36 【问题描述】:

我正在使用 .net 4.0 winforms。在我的应用程序中有一个配置文件(config.xml),在这个文件上我有很多节点和子节点,都是不同的,我想选择特定节点和所选节点内的节点。

我尝试了很多解决方案,但都没有成功。

提前感谢您的帮助。

【问题讨论】:

您可以使用 XDocument 加载 xml 并在对象上调用适当的方法。 您好,请给我更多的示例解释。 @user3066993 - 您在maintenance_anomalies 标签中查找哪个特定标签值? 然后是所有 【参考方案1】:

这应该会给你正确的结果:-

XDocument doc = XDocument.Load(@"XMLFilePath");
XNamespace ns = "http://schemas.datacontract.org/2004/07/Silvio.Settings";
var result = doc.Root.Element(ns + "maintenance_anomalies")
             .Descendants(ns + "nom_operation")
             .Select(x =>
                        new
                           
                              NomOperation = (string)x,
                              statutList = x.Parent.Element(ns + "statuts")
                                                   .Elements(ns + "statut")
                                                   .Select(z => (string)z).ToList()
                           ).ToList();

方法:

从 Xdocument 对象中选择根节点 Main。从中选择元素maintenance_anomalies,包括与其关联的命名空间。从那里您可以选择nom_operation 的所有后代并获取它的值。要在nom_operation 中查找所有statut,请返回父节点operation,然后从那里选择所有statut 元素。

你也可以投影一个类型而不是匿名类型。

得到以下输出:-

【讨论】:

@user3066993 - 这是与您的 XML 关联的命名空间。已更新。 很好的解释。非常感谢。工作正常。 @user3066993 - 不客气 :) 如果对您有帮助,您可以接受答案。 meta.stackexchange.com/questions/5234/…【参考方案2】:

您的 xml 存在一些问题。首先有一个无效字符,所以不要使用 Load 方法。还有一个命名空间问题,所以我使用 Where 方法来获取标签 maintenance_anomalies。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;

namespace ConsoleApplication53

    class Program
    
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        
            string file = File.ReadAllText(FILENAME);
            XDocument doc = XDocument.Parse(file);
            XElement maintenance_anomalies = doc.Descendants().Where(x => x.Name.LocalName == "maintenance_anomalies").FirstOrDefault();
            XNamespace ns = maintenance_anomalies.Name.Namespace;

            var results = maintenance_anomalies.Elements(ns + "operation").Select(x => new
                nom_operation = x.Element(ns + "nom_operation").Value,
                statut = string.Join(",",x.Descendants(ns + "statut").Select(y => y.Value).ToArray())
            ).ToList();
        
    

【讨论】:

嗨,到目前为止一切顺利吗?那么如何选择 节点内的子节点。 然后是所有 使用最新请求更新。 非常感谢。工作正常。【参考方案3】:

下面的行应该让你访问你请求的节点。使用这是你的班级using System.Xml;

 XmlDocument XmlDocObj = new XmlDocument();
 XmlNode UserNameNode = XmlDocObj.SelectSingleNode("maintenance_anomalies");

【讨论】:

您好,请给我更多的示例解释。 @user3066993 XmlDocument 允许您通读 Xml 文档,其中 .SelectSingleNode 选择您要访问的节点。

以上是关于Linq to XML 从 config.xml 选择节点(Lambda 表达式或经典查询)的主要内容,如果未能解决你的问题,请参考以下文章

config.xml写入和读取

Translate this app.config xml to code? (WCF) z

Linq to XML:从查询到变量

LINQ to XML - 从文件加载 XML 片段

使用 linq to xml 从 xml 文档中删除 xmlns="something"

升级jenkins之后无法启动 报错Unable to read /var/lib/jenkins/config.xml