c遍历文件夹下的文件 遍历现有XML文件,同时写入到新文件中

遍历现有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 UTF ); //创建调用的实体 second 要写入的文件 static XmlTextWriter x = new XmlTextWriter(sw); static void Main(string[] args) { XPathDocument doc = new XPathDocument(@ first xml ); //first 第一个文件 XPathNavigator navigator = doc CreateNavigator(); navigator MoveToRoot(); x Formatting = Formatting Indented; CreatFiles( second ); //如果second xml不存在 则在此创建 WriteRecursive(navigator); //从根节点开始 x Flush(); x 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 ) { x WriteEndElement(); } } else x WriteEndElement(); } static private void WriteNode(XPathNavigator navigator) { if (navigator NodeType == XPathNodeType Text) { x WriteString(navigator Value); //写文本节点 } else if (navigator Name != string Empty) { x 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(); } }
lishixinzhi/Article/program/net/201311/13362