Не получаю ничего из моих xmlNodes в C # - PullRequest
0 голосов
/ 23 декабря 2018

Я написал быстрый код, чтобы попытаться получить элементы из XML-файла и поместить их в таблицу Excel, но я ничего не получаю от своих узлов.Я не понимаю, почему.

Я пробовал разные способы получения того, что мне нужно от моих узлов, используя документацию Microsoft XMLDocument, но результат всегда один и тот же, он выводит мне пустые строки.

    [STAThread]
    static void Main(string[] args)
    {
        OpenFileDialog openFileDialog = new OpenFileDialog();
        XmlDocument xmlDocument = new XmlDocument();
        System.Data.DataTable table = new System.Data.DataTable();
        Microsoft.Office.Interop.Excel.Application excel;
        Microsoft.Office.Interop.Excel.Workbook workBook;
        Microsoft.Office.Interop.Excel.Worksheet workSheet;
        int rowCount = 1;

        openFileDialog.Filter = "XML Files|*.xml";
        openFileDialog.Title = "Select the SMS backup";
        if (openFileDialog.ShowDialog() == DialogResult.OK)
        {
            xmlDocument.PreserveWhitespace = true;
            try
            {
                xmlDocument.Load(openFileDialog.FileName);
            }
            catch (System.IO.FileNotFoundException)
            {
            }
            table.Columns.Add("Contact name", typeof(string));
            table.Columns.Add("Date", typeof(DataFormats));
            table.Columns.Add("Message", typeof(string));
            foreach (XmlNode node in xmlDocument.DocumentElement.ChildNodes)
            {
                System.Diagnostics.Debug.WriteLine(node.InnerText);
                if (node.InnerText.Contains("contact_name"))
                {
                    table.Rows.Add(
                        node.Attributes["contact_name"]?.InnerText,
                        node.Attributes["readable_date"]?.InnerText,
                        node.Attributes["body"]?.InnerText
                        );
                }
            }
            try
            {
                excel = new Microsoft.Office.Interop.Excel.Application
                {
                    Visible = true,
                    DisplayAlerts = false
                };
                workBook = excel.Workbooks.Add(Type.Missing);
                workSheet = (Microsoft.Office.Interop.Excel.Worksheet) workBook.ActiveSheet;
                workSheet.Name = "SMS backup";
                foreach (System.Data.DataRow dataRow in table.Rows)
                {
                    rowCount += 1;
                    for (int i = 1; i <= table.Columns.Count; i++)
                    {
                        workSheet.Cells[rowCount, i] = dataRow[i - 1].ToString();
                    }

                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                workSheet = null;
                workBook = null;
            }
        }
    }

1 Ответ

0 голосов
/ 24 декабря 2018

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

Щелкните правой кнопкой мыши узел решения в обозревателе решений и выберите «Управление пакетами Nuget для решения»

Установите epplus - itсоздает файлы Excel напрямую (на самом деле это просто XML-файлы внутри zip-файла с именем xlsx), не требуя взаимодействия с установленным Excel, что может быть проблемой на обратной стороне, и его лучше избегать

Считайте ваш XML-документ в набор данных:

DataSet da = new DataSet();
da.ReadXml(path to your file);

Поместите точку останова в строку readxml и запустите приложение.Перейдите через readxml, затем укажите ds и щелкните по лупе, которая появляется во всплывающей подсказке

. Ознакомьтесь с тем, как XML-документ представлен в DataSet - узлы, имеющие дочерние узлы, как правило, представляются как отдельныетаблицы со связями, связывающими их вместе, так что вы можете в итоге получить xml вроде

xml
  parentnode1
    childnode1
  parentnode2
    childnode2
/xml

У вас будет две таблицы, называемые parentnode и childnode, и вы будете читать их в наборе циклов, например:

foreach(var ro in da.Tables["parentnode"].Rows)
  //do stuff with parent rows

  //iterate child rows
  foreach(var cro in ro.GetChildRows()){
    //do stuff with child rows
  }
}

Не похоже, что ваш xml структурирован таким образом прямо сейчас, но это нелегко сказать

Итак, теперь у вас есть XML-документ в виде набора таблиц в DataSetи вы хотите их как лист Excel.Epplus может создать файл Excel из таблицы данных (DataSet - это набор таблиц данных) в несколько строк кода, см. Экспорт DataTable в Excel с EPPlus

Если ваш DataSet содержит только 1стол, то работа в значительной степени закончена.Если в нем несколько таблиц, я рекомендую вам создать новый DataTable, а затем зациклить DataSet, выбирая значения из различных ds.Tables ["имя таблицы здесь"] и заполняя свой DataTable

Таким образом, чтобы реализовать вашу программу, выполнитенабор комментариев в виде кода

//read xml file to DataSet - 2 lines of code

//EITHER xml is flat structure, results in one datatable in the set 
//so just remove or rename columns as required - few lines

//OR DataSet has 3 tables, make a new datatable and loop over the 3, 
//populating the new one, to flatten it - few lines

//use epplus to turn the single datatable to an excel sheet - 4 lines

Проблема решена, будем надеяться, примерно в 10 строках кода

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...