【问题标题】:Import multiple .xml files into a DataSet将多个 .xml 文件导入数据集
【发布时间】:2011-09-28 19:56:59
【问题描述】:

所以,这就是我想做的:

我想将文件夹中的所有 xml 文件(比如说C:\Bla\AllMyLittleXmlFiles)导入数据集,对其进行处理,然后从那里将其导出到 SQL Server。那可能吗?似乎 DataSet 在每次成功读取文件后都会自行清除,只留下第一个文件的数据。

这是我的代码,包括一些不必要的东西:

        StringBuilder fileNames = new StringBuilder();
        ArrayList filePaths = new ArrayList();
        FolderBrowserDialog folder = new FolderBrowserDialog();
        folder.ShowDialog();
        int pathLength = folder.SelectedPath.Length;
        foreach (string file in Directory.EnumerateFiles(folder.SelectedPath))
        {
            string fielname = file.ToString().Substring(pathLength + 1);
            string filepath = file.ToString();
            fileNames.AppendLine(fielname);
            filePaths.Add(filepath);
        }
       // textBox1.Text = filePaths[0].ToString();

        DataSet aDS = new DataSet();
        StringBuilder uh = new StringBuilder();
        int filesImported = 0;
        foreach (object ob in filePaths)
        {
            string test = ob.ToString();
            uh.Append(test);
           aDS.ReadXml(ob.ToString());
           filesImported++;

        }
        int tablesimported = 0;
        foreach (DataTable table in aDS.Tables)
        {
            dataGridView1.DataSource = table.DefaultView;
            tablesimported++;

        }
        MessageBox.Show("Files Imported:" + filesImported.ToString() + "    Tables Imported : " + tablesimported.ToString());
        textBox1.Text = uh.ToString();

编辑 在尝试了一些答案后,我得到了这个:

        int filesImported = 0;
        foreach (object ob in filePaths)
        {
            dsCollection[filesImported].ReadXml(ob.ToString());
            filesImported++;
        }
        int tablesImported = 0;
        foreach (DataSet ds in dsCollection)
        {
            foreach (DataTable table in ds.Tables)
            {
                mainDS.Merge(table);
                tablesImported++;
            }
        }

然后我在 dsCollection 上调用 Merge 方法。唯一的问题是 dscollection 中的数据集永远不会被实例化,所以......回到方块 2。

【问题讨论】:

    标签: c# xml dataset directory


    【解决方案1】:

    试试这个:

    DataSet ds = new Dataset();
    
    for(int x=0;x<Filepath.Count;x++)
    {
        ds.ReadXml(Filepath[x].ToString());
    }
    

    【讨论】:

    • 同样的问题,不同的迭代方式。
    【解决方案2】:

    也许您可以创建主数据集,然后在读取 xml 到临时数据集后尝试 Merge 这些数据集,如下所示:

    mainDataSet.Merge(tempDataSet);
    

    【讨论】:

      【解决方案3】:

      这将解决你的问题,但不确定它是否有效......

      DataSet[] aDS = new DataSet[filePaths.Count]; 
      StringBuilder uh = new StringBuilder();
      int filesImported = 0;
      foreach (object ob in filePaths)
      {
      string test = ob.ToString();
      uh.Append(test);
      //every xml file gets its own dataset
      //so that new read operation will not clear data
      aDS[filesImported].ReadXml(ob.ToString()); 
      filesImported++;
      
      }
      int tablesimported = 0;
      foreach (DataSet ds in aDS)
      {
      foreach (DataTable table in ds.Tables)
      {
      dataGridView1.DataSource = table.DefaultView;
      tablesimported++;
      
      }
      }
      

      【讨论】:

        【解决方案4】:

        试试这个:

                foreach (object ob in filePaths)
                {
                    string test = ob.ToString();
                    uh.Append(test);
                    DataSet tmpDS = new DataSet();
                    tmpDS.ReadXml(ob.ToString());
                    aDS.Merge(tmpDS);
                    filesImported++;
                }
        

        这将为 aDS 留下每个文件的数据集表,这似乎就是您要查找的内容。

        编辑:[向@Reniuz 表示歉意,他指出了完全相同的方向,但早了 20 分钟!]

        【讨论】:

          【解决方案5】:

          我臃肿而低效的解决方案....我很失望。

          感谢 Niko 和 Reniuz 为我指明了正确的方向。

              private ArrayList GetFilePaths()
              {
                  ArrayList filePaths = new ArrayList();
                  FolderBrowserDialog folder = new FolderBrowserDialog();
                  folder.ShowDialog();
          
                  foreach (string filePath in Directory.EnumerateFiles(folder.SelectedPath))
                  {
                      filePaths.Add(filePath.ToString());
                  }
                  return filePaths;
              }
          
              private void ImportXmls(ArrayList filePaths)
              {
                  DataSet[] tempDSCollection = new DataSet[filePaths.Count];
                  int impFiles = 0;
                  foreach (object ob in filePaths)
                  {
                      DataSet impDS = new DataSet();
                      impDS.ReadXml(ob.ToString());
          
                      tempDSCollection[impFiles] = impDS;
                      impFiles++;
                  }
          
                  foreach (DataSet aDS in tempDSCollection)
                  {
                      foreach (DataTable table in aDS.Tables)
                      {
                          mainDS.Merge(table);
                      }
                  } 
              }
          

          我会继续努力并更新,但现在必须这样做

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多