Разобрать файл XML в datatable - PullRequest
0 голосов
/ 12 марта 2020

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

Это пример файла:

<Report>
<Summary>
<Member Name="Krispy Kreme Doughnuts Inc" ID="7003200" />
<BatchFile Name="ftpoobt200303130547" SendingClientName="" ID="000000587" Format="ANSI" Date="2020-03-03 13:06:31" Result="Successful" Creator="STP-KRISPYKREMED" />
<Total NoTransactions="3" /><Success NoTransactions="3" /><Fail NoTransactions="0" /></Summary>
<Transactions><Transaction RequestID="2593" TransactionID="7003534217" Status="Accepted" Date="2020-03-03 13:06:31" DueDate="2021-01-25 00:00:00" Currency="USD" PaymentAmount="25,584.79" SourceAccount="6190000020" SupplierName="JTM Foods LLC" SupplierAccount="6190000080" MessageText="$$" MessageDescription="" />
<Transaction RequestID="2594" TransactionID="7003534218" Status="Accepted" Date="2020-03-03 13:06:31" DueDate="2021-02-25 00:00:00" Currency="USD" PaymentAmount="327,538.77" SourceAccount="6190000020" SupplierName="BakeMark USA" SupplierAccount="6190000060" MessageText="$$" MessageDescription="" />
<Transaction RequestID="2595" TransactionID="7003534219" Status="Accepted" Date="2020-03-03 13:06:31" DueDate="2021-02-25 00:00:00" Currency="USD" PaymentAmount="48,588.70" SourceAccount="6190000020" SupplierName="Bay State Milling Company" SupplierAccount="6190000070" MessageText="$$" MessageDescription="" />
</Transactions></Report>

И это мой текущий код:

private static DataTable RetrieveXML(string fileToLoad, string source)
{
    DataTable dt = new DataTable();
    XmlDocument doc= new XmlDocument();
    doc.Load(fileToLoad);

    if(doc.ChildNodes[0]!=null)
        dt.Columns.Add(doc.ChildNodes[0].Name); //Assuming you want the rood node to be the only column of the datatable

    //iterate through all the childnodes of your root i.e. Category
    foreach(XmlNode node in doc.ChildNodes[0].ChildNodes )
    {
        dt.Rows.Add(node.Name);
    } 
    return dt;
}

Я могу найти первый и второй внешние узлы (сводка и транзакция), но не уверен, как перейти к фактическим данным. Например, мне нужно имя и значение, идентификатор и значение из узла-члена. Это фактические поля в базе данных.

1 Ответ

0 голосов
/ 12 марта 2020

Попробуйте использовать Xml Linq:

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

namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("RequestID", typeof(int));
            dt.Columns.Add("TransactionID", typeof(string));
            dt.Columns.Add("Status", typeof(string));
            dt.Columns.Add("Date", typeof(DateTime));
            dt.Columns.Add("DueDate", typeof(DateTime));
            dt.Columns.Add("Currency", typeof(string));
            dt.Columns.Add("PaymentAmount", typeof(decimal));
            dt.Columns.Add("SourceAccount", typeof(string));
            dt.Columns.Add("SupplierName", typeof(string));
            dt.Columns.Add("SupplierAccount", typeof(string));
            dt.Columns.Add("MessageText", typeof(string));
            dt.Columns.Add("MessageDescription", typeof(string));

            XDocument doc = XDocument.Load(FILENAME);

            Dictionary<string, Dictionary<string, string>> summary = doc.Descendants("Summary").Elements()
                .GroupBy(x => x.Name.LocalName, y => y.Attributes()
                    .GroupBy(a => a.Name.LocalName, b => (string)b)
                    .ToDictionary(a => a.Key, b => b.FirstOrDefault()))
                .ToDictionary(x => x.Key, y => y.FirstOrDefault());


            foreach (XElement transaction in doc.Descendants("Transaction"))
            {
                dt.Rows.Add(new object[] {
                    (int)transaction.Attribute("RequestID"),
                    (string)transaction.Attribute("TransactionID"),
                    (string)transaction.Attribute("Status"),
                    DateTime.ParseExact((string)transaction.Attribute("Date"), "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture),
                    DateTime.ParseExact((string)transaction.Attribute("DueDate"), "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture),
                    (string)transaction.Attribute("Currency"),
                    decimal.Parse((string)transaction.Attribute("PaymentAmount")),
                    (string)transaction.Attribute("SourceAccount"),
                    (string)transaction.Attribute("SupplierName"),
                    (string)transaction.Attribute("SupplierAccount"),
                    (string)transaction.Attribute("MessageText"),
                    (string)transaction.Attribute("MessageDescription")
                });
            }


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