遍历现有XML文件,同时写入到新文件中. ---(c#)
2008-07-13 13:49
316 查看
用xpathnavigator和实体引用.
xpathnavigator,虽然也是以DOM树方式在内在组织数据,但已经过优化,可对数据进行修改,并且访问灵活,对比XML.LOAD()方式,在效率上提升了不少.
在追加时采用实体引用,这样不会把新XML文件全部载入内存,用流的方式追加到文件末尾,省资源,速度快,当文件较大时尤为明显.
using System.Xml; using System.Xml.XPath; using System.IO;
class Program
{
static StreamWriter sw = new StreamWriter(@"second.txt", true, Encoding.UTF8); //创建调用的实体 ,second---要写入的文件
static XmlTextWriter xtw = new XmlTextWriter(sw);
static void Main(string[] args)
{
XPathDocument doc = new XPathDocument(@"first.xml"); //first---第一个文件
XPathNavigator navigator = doc.CreateNavigator();
navigator.MoveToRoot();
xtw.Formatting = Formatting.Indented;
CreatFiles("second"); //如果second.xml不存在,则在此创建
WriteRecursive(navigator); //从根节点开始
xtw.Flush();
xtw.Close();
}
static private void WriteRecursive(XPathNavigator navigator)
{
if (navigator.HasChildren)
{
navigator.MoveToFirstChild();
WriteNode(navigator);
WriteRecursive(navigator);
navigator.MoveToParent();
while (navigator.MoveToNext())
{
WriteNode(navigator);
WriteRecursive(navigator);
}
if (navigator.MoveToParent() && navigator.Name != "root")
{
xtw.WriteEndElement();
}
}
else
xtw.WriteEndElement();
}
static private void WriteNode(XPathNavigator navigator)
{
if (navigator.NodeType == XPathNodeType.Text)
{
xtw.WriteString(navigator.Value); //写文本节点
}
else if (navigator.Name != string.Empty)
{
xtw.WriteStartElement(navigator.Name); //写元素节点
}
}
static private void CreatFiles(string M_str_fname)
{
XmlTextWriter xWriter = new XmlTextWriter(M_str_fname + ".xml", Encoding.Default);
xWriter.Formatting = Formatting.Indented;
xWriter.WriteStartDocument();
xWriter.WriteComment(M_str_fname);
string name = M_str_fname + ".txt"; //实体文件全名
xWriter.WriteDocType("Log", null, null, " <!ENTITY Log SYSTEM '" + name + "'>");//声明调用文件
xWriter.WriteStartElement("", M_str_fname, "");//引入调用文件
xWriter.WriteEntityRef("Log");
xWriter.WriteEndElement();
xWriter.WriteEndDocument();
xWriter.Flush();
xWriter.Close();
}
}
在vs2008下调试通过.
xpathnavigator,虽然也是以DOM树方式在内在组织数据,但已经过优化,可对数据进行修改,并且访问灵活,对比XML.LOAD()方式,在效率上提升了不少.
在追加时采用实体引用,这样不会把新XML文件全部载入内存,用流的方式追加到文件末尾,省资源,速度快,当文件较大时尤为明显.
using System.Xml; using System.Xml.XPath; using System.IO;
class Program
{
static StreamWriter sw = new StreamWriter(@"second.txt", true, Encoding.UTF8); //创建调用的实体 ,second---要写入的文件
static XmlTextWriter xtw = new XmlTextWriter(sw);
static void Main(string[] args)
{
XPathDocument doc = new XPathDocument(@"first.xml"); //first---第一个文件
XPathNavigator navigator = doc.CreateNavigator();
navigator.MoveToRoot();
xtw.Formatting = Formatting.Indented;
CreatFiles("second"); //如果second.xml不存在,则在此创建
WriteRecursive(navigator); //从根节点开始
xtw.Flush();
xtw.Close();
}
static private void WriteRecursive(XPathNavigator navigator)
{
if (navigator.HasChildren)
{
navigator.MoveToFirstChild();
WriteNode(navigator);
WriteRecursive(navigator);
navigator.MoveToParent();
while (navigator.MoveToNext())
{
WriteNode(navigator);
WriteRecursive(navigator);
}
if (navigator.MoveToParent() && navigator.Name != "root")
{
xtw.WriteEndElement();
}
}
else
xtw.WriteEndElement();
}
static private void WriteNode(XPathNavigator navigator)
{
if (navigator.NodeType == XPathNodeType.Text)
{
xtw.WriteString(navigator.Value); //写文本节点
}
else if (navigator.Name != string.Empty)
{
xtw.WriteStartElement(navigator.Name); //写元素节点
}
}
static private void CreatFiles(string M_str_fname)
{
XmlTextWriter xWriter = new XmlTextWriter(M_str_fname + ".xml", Encoding.Default);
xWriter.Formatting = Formatting.Indented;
xWriter.WriteStartDocument();
xWriter.WriteComment(M_str_fname);
string name = M_str_fname + ".txt"; //实体文件全名
xWriter.WriteDocType("Log", null, null, " <!ENTITY Log SYSTEM '" + name + "'>");//声明调用文件
xWriter.WriteStartElement("", M_str_fname, "");//引入调用文件
xWriter.WriteEntityRef("Log");
xWriter.WriteEndElement();
xWriter.WriteEndDocument();
xWriter.Flush();
xWriter.Close();
}
}
在vs2008下调试通过.
相关文章推荐
- C#读取EXCEL 文件同时向文件中写入数据和Excel的Range对象
- C#笔记 通用文件的读取之二——XML文件的读取与写入
- C#.NET向现有文件添加文本+创建一个新文本文件并写入一个字符串
- dom4j创建xml文件,解析xml,写入xml文件,遍历xml文件
- C# 读取XML文件和写入XML文件
- C#笔记 通用文件的存取之二——XML文件的读取与写入
- C# 文件操作,遍历文件夹、读文件、写入、修改、复制
- C#以排列组合中的“组合”方式遍历某个文件夹下的所有文件
- PHP写一段代码,确保多个进程同时写入一个文件成功
- C# winform写入和读取TXT文件
- C#遍历文件夹下的所有文件
- c#重载窗体关闭事件,遍历文件件下所有文件(及子目录),
- C#SoapFormatter序列化一例:将图片读写入xml文件,并能根据需要在PictureBox中按比例缩小显示
- c# 将byte[]数组写入文件并添加空格(回车)操作
- C#中使用WIN32API来遍历文件和目录
- C#使用XmlWriter写入XML文件
- C#如何遍历一个文件夹下面所有的文件、包括子文件夹里面的文件?
- C#文件上传同时附带参数上传
- c#中采用OLEDB方式来读取EXCEL文件和将数据写入EXCEL文件
- c# 中循环遍历所有文件夹下的文件