使用模型 C# 从数据库创建 XML 文件

Posted

技术标签:

【中文标题】使用模型 C# 从数据库创建 XML 文件【英文标题】:Creating a XML file from a database with a model C# 【发布时间】:2019-09-13 01:03:46 【问题描述】:

所以我需要创建一个从数据库生成 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>

【问题讨论】:

【参考方案1】:

问题解决了:

    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();
    

【讨论】:

【参考方案2】:

为什么不让存储过程为您返回 xml。存储过程中的查询会是这样的:

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

【讨论】:

因为我需要创建一种机制,供用户每天使用新数据创建 XML,所以它不是一次性的。无论如何感谢您的想法:)【参考方案3】:

创建一个方法,该方法接受模型的列表或 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 中的数据填充节点吗? 我会遍历 DataTable 中的每一行,然后在每次迭代中遍历列;然后根据列名属性为每一列生成一个新节点。您可以以某种方式将逻辑合并到我上面编写的代码中。【参考方案4】:

使用 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; 
    



【讨论】:

以上是关于使用模型 C# 从数据库创建 XML 文件的主要内容,如果未能解决你的问题,请参考以下文章

c# 中,如何读取XML文件,并将读取到的内容显示到TreeView中

将 C# 模型序列化为 xml 数据

使用 Linq C# 为 DataTable 的每条记录创建 XML 文件

如何从数据网格中以特定格式创建 txt 文件?

将带有命名空间和属性的 XML 转换为 C# 模型类

使用 Linq 从在线 XML 文件中读取数据