3

我只是想从一个 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 文件中有几个这样的“附加器”节点。以下代码循环遍历每个“附加器”节点。在每个“附加程序”中,我想选择名称为“文件”的参数节点并检查该值是否等于我正在寻找的值。

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 查询的“位置”部分可能不正确,有人能发现我哪里出错了吗?

4

3 回答 3

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 文件中有单个反斜杠。

于 2012-05-16T16:33:16.650 回答
8

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

于 2012-05-16T16:33:34.887 回答
4

您正在转义 where 子句中的斜杠,但 XML 已经有双斜杠 - 尝试在 where 子句中的字符串前面添加一个 @ 以转义转义(并按字面意思获取字符串),看看是否有帮助:

例如

el.Attribute("value").ToString().Equals(@"C:\\Logs\\File.log")) 
于 2012-05-16T16:34:27.947 回答