先定义XML的结构信息如下
- <?xml version="1.0" encoding="utf-8" ?>
- <data>
- <Table1>
- <Column1>Value</Column1>
- <Column2>Value</Column2>
- <Column3>Value</Column3>
- </Table1>
- <Table2>
- <Column1>Value</Column1>
- <Column2>Value</Column2>
- <Column3>Value</Column3>
- <Column4>Value</Column4>
- <Column5>Value</Column5>
- </Table2>
- </data>
/// <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);