【问题标题】:Creating a XML file from a database with a model C#使用模型 C# 从数据库创建 XML 文件
【发布时间】: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>

【问题讨论】:

    标签: c# xml winforms entity-framework


    【解决方案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; }
          }
      
      
      }
      

      【讨论】:

        猜你喜欢
        • 2011-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-21
        相关资源
        最近更新 更多