遍历现有XML文件,同时写入到新文件中. ---(c#)

来源:互联网 发布:什么牌子压力锅好 知乎 编辑:程序博客网 时间:2024/05/18 00:17

用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 &apos;" + name + "&apos;>");//声明调用文件

            xWriter.WriteStartElement("", M_str_fname, "");//引入调用文件

            xWriter.WriteEntityRef("Log");

            xWriter.WriteEndElement();

            xWriter.WriteEndDocument();            

            xWriter.Flush();            

            xWriter.Close();

        }    

}

在vs2008下调试通过.

原创粉丝点击