XML到DataTable(列表项)

时间:2018-06-29 11:28:55

标签: c# xml datatables

这是我的xml模式。

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfResultstring xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Resultstring>
    <Key>Blablabla : </Key>
    <Values>
      <string>79,0441326460292</string>
      <string>76,0959542079328</string>
      <string>74,3061819154758</string>
      <string>78,687039788779</string>
    </Values>
    <Type>list</Type>
  </Resultstring>

  <Resultstring>
    <Key>Blablabla : </Key>
    <Values>
        <string>87,7110395931923</string>
    </Values>
    <Type>double</Type>
  </Resultstring>
</ArrayOfResultstring>

我需要阅读此XML文件并填写数据表。

我正在尝试使用DataSet。

   DataSet ds = new DataSet();
   ds.ReadXml(path);
   DataTable dt = ds.Tables[0];

我的输出数据表就像。 ss

我需要在桌子上显示我的物品。有什么方法可以正确阅读吗?

3 个答案:

答案 0 :(得分:2)

尝试遵循xml linq,它为每个字符串创建一个单独的行:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Data;

namespace ConsoleApplication51
{

    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";

        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("KEY", typeof(string));
            dt.Columns.Add("RESULTING_ID", typeof(string));
            dt.Columns.Add("TYPE", typeof(string));

            XDocument doc = XDocument.Load(FILENAME);
            XElement root = doc.Root;
            XNamespace ns = root.GetDefaultNamespace();

            foreach (XElement resultingString in doc.Descendants(ns + "Resultstring"))
            {
               string key = (string)resultingString.Element("Key");
               string type = (string)resultingString.Element("Type");
               string ids = string.Join(";", resultingString.Descendants("string").Select(x => (string)x));
               dt.Rows.Add(new object[] { key, ids, type });


            }

        }
    }

}

将每个字符串放在单独的列中的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Data;

namespace ConsoleApplication51
{

    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";

        static void Main(string[] args)
        {


            XDocument doc = XDocument.Load(FILENAME);
            XElement root = doc.Root;
            XNamespace ns = root.GetDefaultNamespace();

            int maxString = doc.Descendants(ns + "Resultstring").Select(x => x.Descendants("string").Count()).Max();


            DataTable dt = new DataTable();
            dt.Columns.Add("KEY", typeof(string));
            dt.Columns.Add("TYPE", typeof(string));
            for (int i = 0; i < maxString; i++)
            {
                dt.Columns.Add("RESULTING_ID_" + (i + 1).ToString(), typeof(string));
            }


            foreach (XElement resultingString in doc.Descendants(ns + "Resultstring"))
            {
                string key = (string)resultingString.Element("Key");
                string type = (string)resultingString.Element("Type");
                List<string> row =  resultingString.Descendants("string").Select(x => (string)x).ToList();
                row.Insert(0, key);
                row.Insert(1, type);
                dt.Rows.Add(row.ToArray());
            }

        }
    }

}

答案 1 :(得分:1)

使用Cinchoo ETL-一个开放源代码库,您只需几行代码就可以轻松地将Xml文件转换为DataTable。

对于示例XML文件,您可以按以下方式将数据提取到数据表中

using (var p = new ChoXmlReader(** YOUR XML FILE **)
    .WithField("Key")
    .WithField("Value", xPath: "/Values/string")
    )
{
    var dt = p.SelectMany(r => ((Array)r.Value).OfType<string>().Select(r1 => new { Key = r.Key, Value = r1})).AsDataTable();
}

输出:

enter image description here

希望有帮助。

答案 2 :(得分:0)

您的Resultstring xml节点正在重复。下面的代码对我有用

<Resultstring>
    <Key>Blablabla : </Key>
    <Values>
      <string>79,0441326460292</string>
      <string>76,0959542079328</string>
      <string>74,3061819154758</string>
      <string>78,687039788779</string>
    </Values>
    <Type>list</Type>

    <Key>Blablabla : </Key>
    <Values>
        <string>87,7110395931923</string>
    </Values>
    <Type>double</Type>
  </Resultstring>

数据集代码

  DataSet ds = new DataSet();
   ds.ReadXml(path);
   DataTable dtKey = ds.Tables[0];
   DataTable dtValues = ds.Tables[1];
   DataTable dtstring = ds.Tables[2];
   DataTable dtType = ds.Tables[3];