|
用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下调试通过.
|