'凡' LINQ To XML中的子句没有选择任何内容

时间:2012-05-16 16:30:31

标签: 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>

我的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”部分是不正确的,有人可以找出我出错的地方吗?

3 个答案:

答案 0 :(得分: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;

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

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

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

答案 1 :(得分:8)

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

答案 2 :(得分:4)

你在where子句中转义斜杠,但XML已经有双斜杠 - 尝试在where子句的字符串前面添加@来逃避转义(并按字面意思取字符串)并查看是否有助于:

e.g。

el.Attribute("value").ToString().Equals(@"C:\\Logs\\File.log"))