首页 | 互联网 | IT动态 | IT培训 | Cisco | Windows | Linux | Java | .Net | Oracle | 软件测试 | C/C++ | 嵌入式开发 | 存储世界 | 服务器
网络设备 | IDC | 安全 | 求职招聘 | 数字网校 | 网页设计 | 平面设计 | 技术专题 | 电子书下载 | 教学视频 | 源码下载 | 搜索 | 博客 | 论坛
中国IT实验室Dotnet频道
中国IT教育
Google
首页 ASP.NET  C#  XML/WebService ADO.NET VC.NET VB.NET .NET 资讯动态 专题 RSS订阅 讨论 下载
您现在的位置: 中国IT实验室 >> Dotnet >> .NET Framework >> 正文

遍历现有XML文件,同时写入到新文件中

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

【责编:michael】

中国IT教育

相关产品和培训
文章评论
 友情推荐链接
 认证培训
 专题推荐

 ·WEB程序开发--ASP.NET和PHP、JSP究竟学哪个?
 ·五步带你入门XML
 ·关于Java框架技术专题
 ·XML全攻略技术专题
 ·JAVA开源技术介绍专题
 ·Java嵌入式开发之J2ME技术专题
 ·超前体验 Oracle 11g的5个新特性…
 ·揭密使用VB.NET的五个实用技巧
 ·Oracle和SQL Server常用函数对比专题…
 ·展现C#世界 C#程序设计专题…
 今日更新
 社区讨论
 博客论点
 频道精选
 Dotnet频道相关导航