Импортируйте несколько файлов XML в DataSet - PullRequest
0 голосов
/ 05 июля 2011

Итак, вот что я хочу сделать:

Я бы хотел импортировать все xml-файлы из папки (скажем, C:\Bla\AllMyLittleXmlFiles) в DataSet, сделать что-то для этого и оттуда экспортироватьэто к 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();

EDIT После попытки ответить на некоторые вопросы у меня осталось следующее:

        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++;
            }
        }

, затем я вызываю метод Merge для dsCollection.Единственное, что наборы данных в dscollection никогда не создаются, так что ... обратно в квадрат 2.

Ответы [ 5 ]

3 голосов
/ 05 июля 2011

Может быть, вы могли бы создать основной набор данных, и после прочтения набора данных xml в временный набор данных попробуйте Объединить эти наборы данных следующим образом:

mainDataSet.Merge(tempDataSet);
1 голос
/ 06 июля 2011

Мое раздутое и неэффективное решение .... Я разочарован.

Спасибо Нико и Рениузу за то, что они указали мне правильное направление.

    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);
            }
        } 
    }

Я буду продолжать работать надэто и обновить, но это будет делать сейчас

1 голос
/ 05 июля 2011

это решит вашу проблему, хотя и не уверен, что она эффективна ...

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++;

}
}
0 голосов
/ 05 июля 2011

Попробуйте это:

        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 минутами ранее!]

0 голосов
/ 05 июля 2011

попробуйте это:

DataSet ds = new Dataset();

for(int x=0;x<Filepath.Count;x++)
{
    ds.ReadXml(Filepath[x].ToString());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...