Лучший способ импортировать XML в базу данных C#. NET Core - PullRequest
0 голосов
/ 15 апреля 2020

Я работаю над проектом, который требует, чтобы я взял данные из API XML, который я не контролирую, и вставил эти данные в базу данных (я контролирую) для потребления другим приложением (я контролирую, но могу Не изменяйте и код)

Нам уже удалось получить полный макет базы данных из API XML через специальную конечную точку провайдера, но все другие запросы (для получения данных) выполняются через XML.

В настоящее время у меня есть следующее:

Book.cs - представляет одну из таблиц базы данных

using System;
using System.ComponentModel.DataAnnotations;

namespace Example.Models
{
    public partial class Book
    {
        [Key]
        public int Recordno { get; set; }
        public decimal? Amount { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
        public DateTime? Whenmodified { get; set; }
        public DateTime? Whencreated { get; set; }
        public int? Createdby { get; set; }
        public int? Modifiedby { get; set; }
    }
}

API Return XML - это представляет XML, возвращенный API (SDK уже преобразует его в тип XMLDocument)

<BOOKS>
   <BOOK>
      <RECORDNO>1</RECORDNO>
      <AMOUNT>24.12</AMOUNT>
      <TITLE>This is a title</TITLE>
      <DESCRIPTION>This is a description</DESCRIPTION>
      <WHENMODIFIED></WHENMODIFIED>
      <WHENCREATED>13/03/20 15:23:12</WHENCREATED>
      <CREATEDBY>3</CREATEDBY>
      <MODIFIEDBY></MODIFIEDBY>
   </BOOK>
   <BOOK>
      <RECORDNO>1</RECORDNO>
      <AMOUNT>24.12</AMOUNT>
      <TITLE>This is another title</TITLE>
      <DESCRIPTION>This is another description</DESCRIPTION>
      <WHENMODIFIED>21/03/20 12:45:23</WHENMODIFIED>
      <WHENCREATED>15/03/20 15:23:12</WHENCREATED>
      <CREATEDBY>6</CREATEDBY>
      <MODIFIEDBY>2</MODIFIEDBY>
   </BOOK>
</BOOKS>

В настоящее время мы делаем это с помощью операторов switch, но я Я надеюсь, что есть лучший метод. Partial BookController.cs

var books = new List<Book>();

// response.Data return is a List<XElement>
foreach (var result in response.Data)
{
    var xElements = result.Elements();
    var book = new Book();
    foreach (var element in xElements)
    {
        switch (element.Name.ToString())
        {
            case "RECORDNO":
                book.Recordno = int.Parse(element.Value);
                break;
            case "AMOUNT":
                if (element.Value != string.Empty)
                {
                    book.Amount = int.Parse(element.Value);
                }
                break;
             // etc.
        }
    }
    books.Add(book);
}

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

Ответы [ 3 ]

0 голосов
/ 15 апреля 2020

Добро пожаловать в SO ?

То, что вы пытаетесь сделать здесь, состоит в создании объекта C# в памяти из строкового представления XML, известного как десериализация . Об этом есть много ресурсов (например, MSDN), но вот ссылка на сообщение SO, где OP пытался достичь чего-то похожего.

Применительно к приведенному выше фрагменту кода может выглядеть как то так:

var books = new List<Book>();

var serializer = new XmlSerializer(typeof(Book));
// response.Data return is a List<XElement>
foreach (var result in response.Data)
{
    var book = (Book)serializer.Deserialize(result.CreateReader());
    books.Add(book);
}
0 голосов
/ 15 апреля 2020

Использование xml сериализация

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


namespace ConsoleApplication8
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(FILENAME);
            XmlSerializer serializer = new XmlSerializer(typeof(Books));
            Books books = (Books)serializer.Deserialize(reader);


        }
    }
    [XmlRoot("BOOKS")]
    public class Books
    {
        [XmlElement("BOOK")]
        public List<Book> books { get; set; }
    }
    public partial class Book
    {
        //[Key]
        [XmlElement("RECORDNO")]
        public int Recordno { get; set; }
        [XmlElement("AMOUNT")]
        public decimal? Amount { get; set; }
        [XmlElement("TITLE")]
        public string Title { get; set; }
        [XmlElement("DESCRIPTION")]
        public string Description { get; set; }
        private DateTime Whenmodified { get;set;}
        [XmlElement("WHENMODIFIED")]
        public string _Whenmodified {
            get { return Whenmodified.ToString("dd/MM/yy HH:mm:ss");  }
            set { DateTime.ParseExact(value,"dd/MM/yy HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);}
        }
        private DateTime Whencreated { get; set; }
        public string _Whencreated
        {
            get { return Whencreated.ToString("dd/MM/yy HH:mm:ss"); }
            set { DateTime.ParseExact(value, "dd/MM/yy HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture); }
        }
        [XmlElement("CREATEDBY")]
        public int? Createdby { get; set; }
        [XmlElement("MODIFIEDBY")]
        public int? Modifiedby { get; set; }
    }


}
0 голосов
/ 15 апреля 2020

Вы можете сделать следующее:

  1. использовать XML Инструмент определения схемы (Xsd.exe) для генерации классов
  2. использовать сгенерированные классы для чтения ввода XML
  3. использовать эти данные
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...