1

次の方法を使用して、WCF トレース ファイルからエラー メッセージを収集しています。このコードの問題はXPathDocument使用です。ファイルにエラーがある場合、ドキュメントは読み込まれません。

メソッドを複製するコード、サンプル、または例を持っている人はいますかXmlReader。完全な失敗を回避し、整形式でない「E2ETraceEvent」要素をスキップしようとしています。

たとえば、私が回避しようとしている例外の 1 つは、「名前は '<' 文字で始めることはできません。16 進値は 0x3C です。1 行目の位置は 15716165 です。」

/// <summary>
/// Generates a list of error messages from the specified trace file.
/// </summary>
public static List<string> GatherErrorMessages(string path, string entryHeader, string entryFooter)
{
    List<string> oResult = new List<string>();

    XmlReaderSettings oSettings = new XmlReaderSettings();

    oSettings.ConformanceLevel = ConformanceLevel.Fragment;

    using (FileStream oStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Delete | FileShare.ReadWrite))
    {
        XPathDocument oDocument = new XPathDocument(XmlReader.Create(oStream, oSettings));
        XPathNavigator oNavigator = oDocument.CreateNavigator();

        XmlNamespaceManager oManager = new XmlNamespaceManager(oNavigator.NameTable);
        oManager.AddNamespace("e", "http://schemas.microsoft.com/2004/06/E2ETraceEvent");
        oManager.AddNamespace("s", "http://schemas.microsoft.com/2004/06/windows/eventlog/system");

        XPathNodeIterator oEvents = oNavigator.Select("/e:E2ETraceEvent", oManager);

        while (oEvents.MoveNext())
        {
            XPathNavigator oErrorNode = oEvents.Current.SelectSingleNode("s:System/s:SubType[@Name=\"Error\"]", oManager);

            if (oErrorNode != null)
            {
                XPathNavigator oErrorMessageNode = oEvents.Current.SelectSingleNode("e:ApplicationData/text()", oManager);

                oResult.Add(entryHeader + oErrorMessageNode.Value + entryFooter);
            }
        }
    }

    return oResult;
}
4

0 に答える 0