C#实现Xml日志记录文件的最优方案
2012年01月05日
本文和大家讲解分享一下使用C#来实现Xml日志记录文件的方案。
Xml作为数据存储的一种方式,当数据非常大的时候,我们将碰到很多Xml处理的问题。通常,我们对Xml文件进行编辑的最直接的方式是将xml文件加载到XmlDocument,在内存中来对XmlDocument进行修改,然后再保存到磁盘中。这样的话我们将不得不将整个XML document 加载到内存中,这明显是不明智的(对于大数据XML文件来说,内存将消耗很大,哥表示鸭梨很大)。下面我们将要讲的是如何高效的增加内容(对象实体内容)到xml日志文件中。
(一)设计概要
总体来说,我们将(通过代码)创建两种不同的文件,第一种为Xml文件,第二种为xml片段(txt文件),如下图所示:
我们通过如下的定义来使2个不同的文件相关联。
(二)xml文件的生成
先来看下如何创建相关的xml文件,代码如下:
Code [http://www.xueit.com] private static void InitXmlFile(string xmlLogFilePath, string xmlLogContentFileName, string entityRef)
{
string docType = string.Format("\n\n ]>\n", entityRef, xmlLogContentFileName);
XmlWriterSettings wrapperSettings = new XmlWriterSettings()
{
Indent = true
};
using (XmlWriter writer = XmlWriter.Create(xmlLogFilePath, wrapperSettings))
{
writer.WriteStartDocument();
writer.WriteRaw(docType);
writer.WriteStartElement(ConfigResource.XmlLogFile );
writer.WriteStartElement(ConfigResource.XmlLogCont ent);
writer.WriteEntityRef(entityRef);
writer.WriteEndElement();
writer.WriteEndElement();
writer.Close();
}
}对xml文件内容的写入主要通过XmlWriter来进行操作的。这个方法比较简单,不再讲解,看下我们通过这个方法生成的文件内容:
Code [http://www.xueit.com]
]>
&Locations;
Locations 为实体引用名称,与之相对应的为&Locations; 。
XmlLogContentFile-20110220000120.txt为Xml片段的文件名称,路径是相对于XmlLogFile-20110220000120.xml的。
&Locations;相当于占位符的作用,将用XmlLogContentFile-20110220000120.txt文件的内容来替换XmlLogFile-20110220000120.xml的&Locations;
分享C#实现Xml日志记录文件的最优方案
时间:2011-2-21 9:21:28 来源:www.cnblogs.com 作者:JasenKin
-
-
输出内容如下:
(四)采用lock来避免异常的发生,其次特别要注意对资源的及时释放。
Code [http://www.xueit.com] private static readonly object lockObject = new object();
public static void Write(object logObject)
{
if (logObject == null)
{
return;
}
lock (lockObject)
{
Writing(logObject);
}
}
private static void Writing(object logObject)
{
string entityRef = ConfigResource.EntityRef;
string baseDirectory = InitDirectory();
string baseName = DateTime.Now.ToString("yyyyMMddHHmmss");
string xmlLogFilePath =Path.Combine(baseDirectory ,string.Format(ConfigResource.XmlLogFileName,baseN ame));
XmlLogHelper.XmlFilePath = xmlLogFilePath;
string xmlLogContentFileName = string.Format(ConfigResource.XmlLogContentFileName ,baseName);
string xmlLogContentFilePath = Path.Combine(baseDirectory, xmlLogContentFileName);
if (!File.Exists(xmlLogFilePath))
{
InitXmlFile(xmlLogFilePath, xmlLogContentFileName, entityRef);
}
InitEntityRefFile(xmlLogContentFilePath, logObject, entityRef);
}采用lock来避免同时对文件进行操作,避免异常的发生,保证每次操作都是仅有一个在进行。
lock (lockObject)
{
Writing(logObject);
}
采用using来及时释放掉资源。
using (FileStream fileStream = new FileStream(xmlLogContentFilePath, FileMode.Append,
FileAccess.Write, FileShare.Read))
{
}
(五)单元测试
单元测试的主要代码如下,主要是对Write()方法进行测试,如下:
Code [http://www.xueit.com] [TestMethod()]
public void WriteTest()
{
DeleteFiles();//删除目录下所有文件,避免产生不必要的影响。
List errors = InitErrorData(9);
AssertXmlContent(errors);
}
private static void AssertXmlContent(List errors)
{
foreach (Error error in errors)
{
XmlLogHelper.Write(error);
XmlDocument doc = GetXmlDocument();
XmlNode node = doc.SelectSingleNode("//Error[@Id='" error.GetHashCode().ToString() "']");
Assert.IsTrue(node.Name == typeof(Error).Name);
string path = string.Format("//Error[@Id='{0}']//", error.GetHashCode().ToString());
XmlNode levelNode = doc.SelectSingleNode(path "Level");
XmlNode nameNode = doc.SelectSingleNode(path "Name");
XmlNode descriptionNode = doc.SelectSingleNode(path "Description");
XmlNode timeNode = doc.SelectSingleNode(path "Time");
XmlNode pointNode = doc.SelectSingleNode(path "Point");
Assert.IsTrue(nameNode.Name == "Name");
Assert.IsTrue(levelNode.Name == "Level");
Assert.IsTrue(descriptionNode.Name == "Description");
Assert.IsTrue(timeNode.Name == "Time");
Assert.IsNotNull(levelNode);
Assert.IsNotNull(nameNode);
Assert.IsNotNull(descriptionNode);
Assert.IsNotNull(timeNode);
Assert.IsNull(pointNode);
Assert.IsTrue(nameNode.InnerText == (error.Name ?? string.Empty));
Assert.IsTrue(levelNode.InnerText == error.Level.ToString());
Assert.IsTrue(timeNode.InnerText == DateTime.MinValue.ToString());
Assert.IsTrue(descriptionNode.InnerText == (error.Description ?? string.Empty));
}
}上面仅仅是针对一个自定义的Error类进行了验证................
(六)其他应用
当我们的Xml日志文件可以记录的时候,我们可能想通过界面来看下效果,比如如下所示意的图中,点击【生成XML日志文件】,再点击【获取XML日志文件】的时候,我们能够看到生成的XML日志文件。
其中生成的文件名称显示如下:
多次点击【生成XML日志文件】,再点击【获取XML日志文件】的时候,我们能够看到生成的XML日志文件数量也递增(因为我将文件的名称设置为string baseName = DateTime.Now.ToString("yyyyMMddHHmmss");,按照秒数来计算的)。点击任何一个文件,将显示该文件的相关全部xml内容(包括xml文件和xml片段)。
点击【删除XML日志文件】将删除所有的xml文件,如下:
(七)总结
对于流的操作来说,应尽快释放掉系统资源,促使GC的Finalize()方法的执行,同时可以避免异常的发生。对于Xml日志来说,当数据量越来越大的时候,我们可以将内容分为两部分,一部分为标准的哦xml文件,另一部分为xml片段文件。这样,我们能够在xml片段文件中方便地在文件末尾处增加相关的内容,这种效率是非常快的,而通常我们通过XMLDocument来加载数据非常消耗内存,效率较低(数据量越大越明显)。同时在读取xml文件的时候也会通过实体引用将相关的xml片段引用进来,从而使二个文件成为一个整体。再次,在将对象转换成xml的时候,通过反射来获取相关的数据,并将数据写入xml格式中,这个地方还有提高。希望各位在看完此文后也能熟练的运用XML日志文件来对日志进行记录。
发表评论
-
周线选
2012-01-20 11:11 824周线选 21小时前 大盘30日线起码走平 周 ... -
2011年全国大学生数学建模竞赛c题个人分析
2012-01-20 11:11 9522011年全国大学生数学建模竞赛c题个人分析 2011年09 ... -
冲刺一答案
2012-01-20 11:11 550冲刺一答案 23小时前 冲刺押题卷一 政治冲刺试卷 ... -
C# 线程手册 第二章 .net 中的线程 创建一个线程
2012-01-20 11:10 577C# 线程手册 第二章 .net 中的线程 创建一个线程 2 ... -
单元过关----捷达学校中级《财务管理》测试题(6)
2012-01-20 11:10 1813单元过关----捷达学校中 ... -
【转】 oracle exception总结(读书笔记)
2012-01-19 16:01 648【转】 oracle exception总结(读书笔记) 2 ... -
php编译mysql configure: error: mysql configure failed. Please check config.log for more information
2012-01-19 16:01 1286php编译mysql configure: error: my ... -
Error in symeqn called by dstmak. Please send data to your ANSYS Technical S
2012-01-19 16:01 1787Error in symeqn called by dstma ... -
linux设备模型深探(2)【转】
2012-01-19 16:01 829linux设备模型深探(2)【转】 2011年12月07日 ... -
JavaScript跨域总结与解决办法
2012-01-17 05:53 516JavaScript跨域总结与解决 ... -
关于fckeditor在服务器上无法上传图片的问题
2012-01-17 05:53 962关于fckeditor在服务器上无法上传图片的问题 2010 ... -
FCKEditor 2.6.3 ASP.NET 图片上传 停留在进度条问题解决
2012-01-17 05:53 782FCKEditor 2.6.3 ASP.NET 图片上传 停留 ... -
寻访福建最美乡村之 南安蔡浅古大厝
2012-01-16 04:40 1187寻访福建最美乡村之 ... -
专项训练十七
2012-01-16 04:39 676专项训练十七 2012年01 ...
相关推荐
C#下txt日志记录文件,自动周期循环定期删除,能修改路径,分文件夹存储不同的日志文件
C#实现XML文件的读取,用来修改配置文件。
C# 生成 XML 文件,编码为 UTF-...C# 生成 XML 文件,编码为 UTF-8 方法可以满足数据交换、配置文件、日志记录等领域的需求,可以确保生成的 XML 文件正确地表达 Unicode 字符,并与其他系统和应用程序进行良好的集成。
综上所述,"C# 读取XML文件并写入Excel表格"这一主题涵盖了XML解析和Excel操作的关键技术,对于数据处理和报告生成等场景非常实用。在实际应用中,开发者可以根据具体需求调整代码逻辑,以满足各种复杂的业务需求。
这个主题主要涉及如何利用XML文件存储不同语言的文本资源,然后在C#程序中动态加载和切换这些资源,以实现用户界面的本地化。下面我们将详细探讨这一过程。 1. **XML文件结构**: XML文件是一种结构化的数据存储...
下面将详细介绍如何使用C# WinForm来实现XML文件的读取和导出功能。 首先,你需要创建一个WinForm应用程序,添加MenuStrip控件来实现用户界面。在这个MenuStrip中,创建两个菜单项,分别命名为“读取”和“导出数据...
当我们需要将XML文件中的数据存入数据库时,有多种策略可以实现。下面,我们将详细介绍三种使用C#读取XML文件并将其写入数据库的方法。 1. **使用XmlReader类逐行读取并写入** - `XmlReader` 是一个高效的流式读取...
本文将深入探讨如何在C#中实现XML文件的树形显示,以及如何进行节点的插入和删除操作。 首先,我们需要了解如何在C#中加载XML文件。这通常通过使用`System.Xml`命名空间中的`XmlDocument`类来完成。以下是一个简单...
标题"C#实现键盘记录与日志实例"表明我们将探讨如何利用C#来创建一个程序,该程序能够监听用户的键盘输入,并将这些输入保存为日志。在C#中,我们可以使用各种技术来实现这个功能,包括Windows API调用和事件处理。 ...
在C#编程环境中,处理XML文件的加密和解密是一项重要的任务,特别是在处理敏感数据时。XML文件因为其结构清晰、易于解析而被广泛应用,但同时也需要妥善保护以防止未授权访问。以下是对C#中XML文件加密和解密的详细...
【基于C#的XML可视化界面编辑系统】 XML(Extensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置存储以及文档结构化等领域。在实际应用中,XML文档的编写通常需要一定的技术背景,这...
在本文中,我们将深入探讨如何使用C#编程语言解析XML文件,并将其内容在Windows Forms(WinForm)应用程序中展示。XML(eXtensible Markup Language)是一种数据存储和交换的标准格式,而C#是Microsoft .NET框架下...
当我们需要在C#项目中处理XML文件时,有多种方法可以实现,而高效地读取和遍历XML文件对于优化程序性能至关重要。 标题"用C#快速读取XML文件,并遍历"所涉及的核心知识点包括: 1. **System.Xml命名空间**:C#中...
本文实例讲述了C#通过DataSet读写xml文件的方法。分享给大家供大家参考。具体实现方法如下: ... 您可能感兴趣的文章:C# 创建,读取,写入XML文件C#操作读取、写入XML文档的实用方法C#实现xml文件的读取与写入简单
本文将深入探讨一个使用C#语言实现的日志记录器的实例,该实例具备按日期分文件记录以及设定日志文件大小的功能。 首先,让我们了解“LogRecorder.sln”文件。这是一个Visual Studio解决方案文件,它包含了项目及其...
这个程序的核心功能是通过C#编程语言实现定时任务,以自动清理指定目录下的日志文件。C#是一种面向对象的编程语言,广泛应用于Windows平台的软件开发,具有丰富的类库和强大的性能。利用C#的System.Threading命名...
以上是对已经存在的类的方法进行日志记录采用动态代理该类,对于方法内部的某个地方进行日志记录的,采用动态代理Stopwatch来实现。因为方法内部的日志一般都要统计时间长度,动态代理Stopwatch的Start方法和Stop...
本篇文章将深入探讨如何在C#中读取XML配置文件。 首先,让我们了解XML配置文件的基本结构。一个简单的XML配置文件可能如下所示: ```xml <?xml version="1.0" encoding="utf-8"?> ``` 在C#中,读取XML...
本教程将深入探讨如何使用C#对XML文件进行读写、增删改查操作。 首先,我们来了解C#中的System.Xml命名空间,它是处理XML的基础。该命名空间包含许多类,如XmlDocument、XmlNode、XmlElement等,用于创建、解析和...