次の方法を使用して、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;
}