При выполнении linq to xml и отображении данных в datagridview мой код обрабатывает только один файл в папке - PullRequest
0 голосов
/ 13 сентября 2011

Почему во время синтаксического анализа linq to xml мой код читает только один файл xml в папке, а не все?

private void button1_Click(object sender, EventArgs e)
{
    string[] fileEntries = Directory.GetFiles(@"", "*.cfg*");
    foreach (string fileName in fileEntries)
    {
        XDocument doc = XDocument.Load(fileName);
        var query = from x in doc.Descendants("")
                    select new
                    {

                        MaxChild = x.Element("Max").Value,
                        MinChild = x.Element("Min").Value
                    };


        var query2 = from y in doc.Descendants("")

                     select new
                     {

                         MaxChild = y.Element("Max").Value,
                         MinChild = y.Element("Min").Value

                     };


        var query3 = from z in doc.Descendants("")

                     select new
                     {

                         MaxChild = z.Element("Max").Value,
                         MinChild = z.Element("Min").Value
                     };

        var bs3 = new BindingSource { DataSource = query.Union(query2.Union(query3)) };

        dataGridView1.AutoGenerateColumns = true;
        dataGridView1.AutoSize = true;

        dataGridView1.DataSource = bs3;
        dataGridView1.Columns[0].HeaderText = "Max";
        dataGridView1.Columns[1].HeaderText = "Min";

    }  
}

1 Ответ

2 голосов
/ 13 сентября 2011

Вы перебираете файлы в каталоге, но каждый раз просто переназначаете источник данных. Другими словами, это та же самая проблема, что и в вашем предыдущем вопросе , за исключением того, что вместо того, чтобы делать с тремя запросами, это связано с переназначением его для каждого файла.

Попробуйте вместо этого, используя один запрос:

var query = from file in fileEntries
            let doc = XDocument.Load(file)
            from x in doc.Descendants("XAxisCalib")
                         .Concat(doc.Descendants("YAxisCalib"))
                         .Concat(doc.Descendants("ZAxisCalib"))
            select new
            {
                // Include this to see the file for each value
                File = file,
                MaxChild = x.Element("Max").Value,
                MinChild = x.Element("Min").Value
            };

var bs3 = new BindingSource { DataSource = query };

dataGridView1.AutoGenerateColumns = true;
dataGridView1.AutoSize = true;

dataGridView1.DataSource = bs3;

РЕДАКТИРОВАТЬ: Хорошо, если вы знаете, что будет точно один из каждого элемента, это довольно просто:

var query = from file in fileEntries
            let doc = XDocument.Load(file)
            let x = doc.Descendants("XAxisCalib").Single()
            let y = doc.Descendants("YAxisCalib").Single()
            let z = doc.Descendants("ZAxisCalib").Single()
            select new
            {
                // Include this to see the file for each value
                File = file,
                MaxChildX = x.Element("Max").Value,
                MinChildX = x.Element("Min").Value,
                MaxChildY = y.Element("Max").Value,
                MinChildY = y.Element("Min").Value,
                MaxChildZ = z.Element("Max").Value,
                MinChildZ = z.Element("Min").Value
            };
...