您的位置:首页 > 编程语言 > C#

遍历现有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下调试通过.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: