LINQ To XML中的"Where"子句没有选择任何内容

Duk*_*ade 3 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>
<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>
Run Code Online (Sandbox Code Playgroud)

我的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
            }
        }
Run Code Online (Sandbox Code Playgroud)

但是我的代码没有打印出来,所以我想可能我的LINQ查询的"where"部分是不正确的,任何人都可以找到我错的地方吗?

Jon*_*eet 8

你在打电话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;
Run Code Online (Sandbox Code Playgroud)

我个人不打扰这里的查询表达式,顺便说一下:

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

编辑:此外,正如其他人所说,你想在XML文件中有单个反斜杠.


das*_*ght 8

XML文件中的属性包含双倍斜杠,但您匹配单个斜杠.要匹配XML/TXT文件中的双斜杠,需要在C#文件中使用四个斜杠.