C# LINQ To XML中的Where子句未选择任何内容

C# LINQ To XML中的Where子句未选择任何内容,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,我只是想从一个XML文件中读取一些细节,其中一部分如下所示: <appender name="FILE" class="applications.core.logging.CustomFileAppender"> <param name="File" value="C:\\Logs\\File.log"/> <param name="MaxBackupIndex" value="5"/> </appender> <append

我只是想从一个XML文件中读取一些细节,其中一部分如下所示:

<appender name="FILE" class="applications.core.logging.CustomFileAppender">
    <param name="File" value="C:\\Logs\\File.log"/>
    <param name="MaxBackupIndex" value="5"/>
</appender>
<appender name="FILE" class="applications.core.logging.CustomFileAppender">
    <param name="File" value="C:\\Logs\\File2.log"/>
    <param name="MaxBackupIndex" value="17"/>
</appender>
<appender name="FILE" class="applications.core.logging.CustomFileAppender">
    <param name="File" value="C:\\Logs\\File3.log"/>
    <param name="MaxBackupIndex" value="98"/>
</appender>
我的XML文件中有几个这样的“appender”节点。下面的代码循环遍历每个“appender”节点。在每个“appender”中,我想选择名为File的param节点,并检查该值是否等于我要查找的值

foreach (XElement node in XmlFile.Descendants("appender"))
        {
            IEnumerable<XElement> elements = from el in node.Elements("param") 
                                             where el.Attribute("value").ToString().Equals("C:\\Logs\\File.log")) 
                                             select el;

            foreach (XElement el in elements)
            {
                Console.WriteLine("Found it " + el.Name);
                // Now read value for MaxBackupIndex
            }
        }
但是,我的代码没有打印出任何内容,因此我认为我的LINQ查询的“where”部分可能不正确,有人能发现我的错误吗?

您正在调用XAttribute.ToString。尝试改用XAttribute.Value,或者直接转换为字符串。ToString将返回value=C:\\Logs\\File.log-名称和值-而您只需要值:

var elements = from el in node.Elements("param")
               where (string) el.Attribute("value") == "C:\\Logs\\File.log"
               select el;
就我个人而言,我不会在这里使用查询表达式,顺便说一句:

var elements = node.Elements("param")
         .Where(el => (string) el.Attribute("value") == "C:\\Logs\\File.log")

编辑:另外,正如其他人所说,您希望在XML文件中有一个反斜杠。

XML文件中的属性包含两个斜杠,但您正在匹配单个斜杠。要匹配XML/TXT文件中的双斜杠,您的C文件中需要四个斜杠。

您正在where子句中转义斜杠,但XML已经有双斜杠-尝试在where子句中的字符串前面添加@以转义,并按字面理解字符串,看看这是否有帮助:

e、 g


非常肯定XML在这种情况下是错误的,而不是解析代码,无论哪种方式使用@都是一个好主意,我可以看到您的来源-但是OP没有说他们已经创建了文件,所以我假设他们希望XML保持原样:这是一个好观点,但不幸的是不是答案,当我确定两个答案都是双答案时,仍然不匹配。@Jim:你需要将两个答案结合起来才能得到你想要的,你有两个答案mistakes@Jim乔恩·斯基特指出了另一个问题——我想你需要一组答案来解决这个问题。@dasblinkenlight:我已经编辑了我的答案,所以它包含了这两个答案。我从一开始就完全错过了它。+1 ToString是主要问题。我还将使用字符串文字@C:\Logs\File.log,而不是转义所有反斜杠
el.Attribute("value").ToString().Equals(@"C:\\Logs\\File.log"))