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