Создание файла XML из базы данных с моделью C # - PullRequest
0 голосов
/ 23 апреля 2019

Итак, мне нужно создать метод, который создает 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>

Ответы [ 4 ]

0 голосов
/ 08 мая 2019

Проблема решена:

    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();
    }
0 голосов
/ 23 апреля 2019

Создайте метод, который принимает список или объект 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;
    }
0 голосов
/ 24 апреля 2019

Использовать XML Serializer:

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; }
    }


}
0 голосов
/ 23 апреля 2019

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

SELECT Sifra, Naziv, JM, Kolicina, Cena_x0020_vp, Cena_x0020_mp, Cena_x0020_bod, Slika, Grupa 
FROM DataModel
FOR XML AUTO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...