XML в DataTable (элемент списка) - PullRequest
0 голосов
/ 29 июня 2018

Вот моя схема 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 голосов
/ 29 июня 2018

Попробуйте следующий 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());
            }

        }
    }

}
0 голосов
/ 29 июня 2018

С 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

Надеюсь, это поможет.

0 голосов
/ 29 июня 2018

Ваш 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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...