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 ファイルには、これらの「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' 部分が間違っている可能性があります。

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")

EDIT:さらに、他の人が言ったように、XMLファイルに単一のバックスラッシュが必要です。

于 2012-05-16T16:33:16.650 に答える
8

XML ファイル内の属性には二重のスラッシュが含まれていますが、単一のスラッシュと一致しています。XML/TXT ファイルで二重スラッシュを一致させるには、C# ファイルで 4 つのスラッシュが必要です。

于 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 に答える