【问题标题】:Not getting anything out of my xmlNodes in C#在 C# 中没有从我的 xmlNodes 中得到任何东西
【发布时间】:2018-12-23 18:32:39
【问题描述】:

我编写了一个快速代码来尝试从 XML 文件中获取元素并将它们放入一个 excel 表中,但我没有从我的节点中得到任何东西。我不明白为什么。

我一直在尝试使用 XMLDocument 的 Microsoft 文档从节点获取所需内容的不同方法,但结果始终相同,它打印的是空行。

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

【问题讨论】:

  • 使用EPplus,将你的xml文件读入数据表,输出到excel。大约需要 10 行代码

标签: c# xml-parsing


【解决方案1】:

根据我的评论,这里有一些更深入的建议。我是在手机上写的,所以请原谅它不是一个完整的工作代码

在解决方案资源管理器中右键单击您的解决方案节点,然后选择管理解决方案的 Nuget 包

安装 epplus - 它直接创建 excel 文件(它们实际上只是一个名为 xlsx 的 zip 文件中的 xml 文件)而不需要安装 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 可以通过几行代码从数据表(DataSet 是数据表的集合)创建一个 excel 文件,见Export DataTable to excel with EPPlus

如果您的 DataSet 仅包含 1 个表,那么工作就差不多结束了。如果它有多个表,我建议您自己创建一个新的 DataTable,然后遍历 DataSet 从各种 ds.Tables["table name here"] 中挑选值并填充您的 DataTable

因此要实现您的程序,请将这组 cmets 实现为代码

//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 行代码左右

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 2015-11-08
    相关资源
    最近更新 更多