Создание XML-файла из базы данных с моделью C#

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

public string CreateXML(Object YourClassObject){    
      XmlDocument xmlDoc =new XmlDocument();   //Represents an XML document, 
                // Initializes a new instance of the XmlDocument class.          
      XmlSerializer xmlSerializer = new XmlSerializer(YourClassObject.GetType());            
    // Creates a stream whose backing store is memory. 
       using (MemoryStream xmlStream =new MemoryStream())
       { 
        xmlSerializer.Serialize(xmlStream, YourClassObject);
        xmlStream.Position = 0;
        //Loads the XML document from the specified string.
        xmlDoc.Load(xmlStream); 
        return xmlDoc.InnerXml;
       }
}

Это какой-то код, который я нашел в Интернете, и я думаю, что могу использовать его для сериализации своей модели, но я обращаюсь к базе данных через созданное мной событие (я предоставлю код завтра, когда приступлю к работе). Во всяком случае, я получаю доступ к базе данных в событии, подобном следующему e.DataTable. Любые идеи кто-нибудь?

Моя модель выглядит следующим образом:

public class DataModel
{
string Sifra {get; set;}
public string Naziv {get; set;}
public string JM {get; set;}
public int Kolicina {get; set;}
public float Cena_x0020_vp {get; set;}
public float Cena_x0020_mp {get; set;}
public float Cena_x0020_bod {get; set;}
public string Slika {get; set;}
public string Grupa {get; set;}
}

Это пример того, как должен выглядеть мой сгенерированный XML.

<?xml version = "1.0" encoding = "UTF-8"?>

<dataroot xmlns:od = "urn:schemas-microsoft-com:officedata" generated = "2019-04-17T19:13:54">

<row>

<Sifra>ADA110-100</Sifra>

<Naziv_x0020_artikla>Adapter 220/110VAC 100W</Naziv_x0020_artikla>

<JM>kom</JM>

<Kolicina>1</Kolicina>

<Cena_x0020_vp>2683.33</Cena_x0020_vp>

<Cena_x0020_mp>3220</Cena_x0020_mp>

<Cena_x0020_bod>28</Cena_x0020_bod>

<Slika1> ada110v.jpg</Slika1>

<Grupa>Adateri 110V AC</Grupa>

</row>
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 653
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Почему бы не позволить хранимой процедуре вернуть вам xml. Запрос в хранимой процедуре будет выглядеть примерно так:

SELECT Sifra, Naziv, JM, Kolicina, Cena_x0020_vp, Cena_x0020_mp, Cena_x0020_bod, Slika, Grupa 
FROM DataModel
FOR XML AUTO

Поскольку мне нужно создать механизм, который пользователь будет использовать для ежедневного создания XML-файлов с новыми данными, это не одноразовая вещь, которая будет использоваться. Все равно спасибо за идею :)

ConsS 23.04.2019 21:54

Создайте метод, который принимает список или объект IEnumerable моделей и возвращает строку, содержащую XML (непроверенный, но должен помочь вам начать работу), это предполагает, что у вас уже есть данные базы данных в пригодных для использования объектах:

    public string GetXmlForModels(IEnumerable<DataModel> dataModels)
    {
        //Assume a list of DataModels is in dataModels of type IEnumerable<DataModel>
        var doc = new XmlDocument();
        foreach (var model in dataModels)
        {
            var row = (XmlElement)doc.AppendChild(doc.CreateElement("row"));
            row.SetAttribute("xmlns:od", "urn:schemas-microsoft-com:officedat");
            row.SetAttribute("generated", DateTime.Now.ToString("yy-MM-ddTHH:mm:ss"));

            var sifraElement = doc.CreateElement("Sifra");
            sifraElement.InnerText = model.Sifra;
            row.AppendChild(sifraElement);

            //Repeat top 3 lines for each element ...

            doc.AppendChild(row);
        }

        return doc.OuterXml;
    }

Это может сработать, я попробую завтра, есть идеи, как заполнить узлы данными из DataTable?

ConsS 23.04.2019 21:57

Я бы перебирал каждую строку в DataTable, а затем внутри каждой итерации перебирал бы столбцы; затем создайте новый узел для каждого столбца на основе свойства имени столбца. Вы могли бы каким-то образом включить логику в код, который я написал выше.

Matt Drouillard 23.04.2019 22:04

Используйте XML-сериализатор:

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

namespace ConsoleApplication110
{
    class Program
    {
        const string INPUT_FILENAME = @"c:\temp\test.xml";
        const string OUTPUT_FILENAME = @"c:\temp\test1.xml";
        static void Main(string[] args)
        {
             XmlReader reader = XmlReader.Create(INPUT_FILENAME);

            string xml = reader.ToString();
            XmlSerializer serializer = new XmlSerializer(typeof(DataRoot));
            DataRoot root = (DataRoot)serializer.Deserialize(reader);

            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true;
            XmlWriter writer = XmlWriter.Create(OUTPUT_FILENAME,settings);
            serializer.Serialize(writer, root);
        }
    }
    [XmlRoot(ElementName = "dataroot", Namespace = "")]
    public class DataRoot
    {
        [XmlElement(ElementName = "row", Namespace = "")]
        public List<DataModel> rows { get; set; }
    }
    [XmlRoot(ElementName = "row", Namespace = "")]
    public class DataModel
    {

        string Sifra { get; set; }
        public string Naziv { get; set; }
        public string JM { get; set; }
        public int Kolicina { get; set; }
        public float Cena_x0020_vp { get; set; }
        public float Cena_x0020_mp { get; set; }
        public float Cena_x0020_bod { get; set; }
        public string Slika { get; set; }
        public string Grupa { get; set; }
    }


}
Ответ принят как подходящий

Задача решена:

    private void CreateXML(DataTable dataTable)
    {                   
        var list = new List<Row>();

        XmlSerializer writer = new XmlSerializer(typeof(List<Row>));

        var path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\ExportZaWeb.xml";
        FileStream file = File.Create(path);

        foreach (DataRow row in dataTable.Rows)
        {
            Row r = new Row();

            r.Naziv = row["Naziv Artikla"].ToString();
            r.JM = row["JM"].ToString();
            r.Kolicina = row["Kolicina"].ToString();
            r.Cena_x0020_vp = row["Cena vp"].ToString();
            r.Cena_x0020_mp = row["Cena mp"].ToString();
            r.Cena_x0020_bod = row["Cena bod"].ToString();
            r.Slika = row["Slika1"].ToString();
            r.Grupa = row["Grupa"].ToString();

            list.Add(r);
        }

        writer.Serialize(file, list);
        file.Close();
    }

Другие вопросы по теме