对XML文件进行合并 并读入到DataSet

来源:互联网 发布:网络进货渠道有哪些 编辑:程序博客网 时间:2024/05/16 10:19

先定义XML的结构信息如下

        /// <summary>
        /// 创建DataSet结构,与XML文档结构保持一致
        /// </summary>
        /// <returns>数据集</returns>
        private DataSet createDataSet()
        {
            DataSet ds = new DataSet();
            DataTable dt = new DataTable("Table1");
            dt.Columns.Add("Column1", typeof(string));
            dt.Columns.Add("Column2", typeof(string));
            dt.Columns.Add("Column3", typeof(string));
            ds.Tables.Add(dt);
            dt = new DataTable("Table2");
            dt.Columns.Add("Column1", typeof(string));
            dt.Columns.Add("Column2", typeof(string));
            dt.Columns.Add("Column3", typeof(string));
            dt.Columns.Add("Column4", typeof(string));
            dt.Columns.Add("Column5", typeof(string));
            ds.Tables.Add(dt);
            return ds;
        }

        /// <summary>
        /// 创建 XML文件
        /// </summary>
        /// <param name="path">创建路径</param>
        private void createXMLFile(string path)
        {
            if (File.Exists(path)) //判断文件是否已存在
            {
                if (DialogResult.Yes == MessageBox.Show("合并文档已存在!是否要替换原有数据?否则将在原有数据的基础上进行追加", "提示", MessageBoxButtons.YesNo))
                {
                    XmlDocument xmlDoc = new XmlDocument();
                    xmlDoc.Load(path);
                    XmlNode root = xmlDoc.DocumentElement; //获取根节点
                    root.RemoveAll(); //清除根节点下的全部信息
                    xmlDoc.Save(path); //保存
                }
                return;
            }
            XmlTextWriter xmlWriter = new XmlTextWriter(path, Encoding.UTF8);//创建一个xml文档
            xmlWriter.Formatting = Formatting.Indented; //设置缩进
            xmlWriter.WriteStartDocument();
            //创建根节点
            xmlWriter.WriteStartElement("data");
            ////新建节点
            //xmlWriter.WriteStartElement("日期");
            ////写节点内容
            //xmlWriter.WriteString(System.DateTime.Now.Year + "-" + System.DateTime.Now.Month + "-" + System.DateTime.Now.Day);
            //xmlWriter.WriteEndElement();
            xmlWriter.WriteEndElement();
            xmlWriter.Close();
        }

        /// <summary>
        /// 对 xml文件进行合并,并另存为一个新的xml文件
        /// </summary>
        /// <param name="subFile">要参与合并的xml文件路径</param>
        /// <param name="targetFile">合并后的新xml文件路径</param>
        private void MergeXmlFiles(string subFile, string targetFile)
        {
            XmlDocument subDoc = new XmlDocument();
            XmlDocument targetDoc = new XmlDocument();
            subDoc.Load(subFile);   //参与合并的xml文档
            targetDoc.Load(targetFile); //合并后的xml文档
            //获取合并文档的根节点
            XmlNode targetRoot = targetDoc.DocumentElement;
            //获取要合并的xml文档根节点下的所有子节点信息
            XmlNodeList nodeList = subDoc.SelectSingleNode("data").ChildNodes;
            foreach (XmlNode xn in nodeList)
            {
                //非同一xml文档的节点,在添加之前必须先导入(本人实在是太喜欢这句了~~
              targetRoot.AppendChild(targetDoc.ImportNode(xn, true));
            }  
            targetDoc.Save(targetFile);//保存到合并文档
        }

 

关键代码段:

            string targetFilePath = string.Empty;
            FolderBrowserDialog fBD = new FolderBrowserDialog();
            if (fBD.ShowDialog() == DialogResult.OK)
            {
                string folderPath = fBD.SelectedPath;
                string[] files = Directory.GetFiles(folderPath, "*.xml"); //获取所有要参与合并的xml文件
                if (files.Length == 0)
                {
                    MessageBox.Show("您所选的文件夹下没有XML文件", "提示");
                    return;
                }
                //指定合并后的文档路径
                targetFilePath = folderPath + @"/mergeResult.xml";
                //创建XML合并文档
                createXMLFile(targetFilePath);
                int fileCount = 0; //统计参与合并的XML文件数
                //对提取出的所有xml文件进行合并
                foreach (string file in files)
                {
                    if (!file.Equals(targetFilePath)) //排除可能存在的合并文档
                    {
                        fileCount++;
                        MergeXmlFiles(file, targetFilePath);
                    }
                }
                //提示成功合并
                MessageBox.Show(string.Format("您所选的文件夹下共有{0}个XML文件,成功合并!", fileCount), "提示");
            }
            DataSet ds = createDataSet();
            //把XML文件数据读入到DataSet相应的表结构中
            ds.ReadXml(targetFilePath);

原创粉丝点击