1

我正在使用以下方法从 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;
}
4

0 回答 0