我正在使用以下方法从 WCF 跟踪文件中收集错误消息。这段代码的问题是XPathDocument
使用。如果文件中有任何错误,则不会加载该文档。
有没有人有复制该方法的代码、示例或示例,但仅使用XmlReader
. 我试图避免完全失败并跳过任何格式不正确的“E2ETraceEvent”元素。
例如,我试图避免的一个例外是“名称不能以 '<' 字符开头,十六进制值 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;
}