【问题标题】:Convert Dataset to XML将数据集转换为 XML
【发布时间】:2012-01-13 02:47:59
【问题描述】:

我已经被这个问题困扰了几个小时,似乎无法弄清楚,所以我在这里问:)

好的,我有这个功能:

private void XmlDump()
{
    XDocument doc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
    XElement rootElement = new XElement("dump");
    rootElement.Add(TableToX("Support"));

    string connectionString = ConfigurationManager.ConnectionStrings["MyDb"].ConnectionString;
    SqlConnection con = new SqlConnection(connectionString);
    string sql = "select * from support";
    SqlDataAdapter da = new SqlDataAdapter(sql, con);

    DataSet ds = new DataSet("Test");
    da.Fill(ds, "support");

    // Convert dataset to XML here

    var docresult = // Converted XML

    Response.Write(docResult);
    Response.ContentType = "text/xml; charset=utf-8";
    Response.AddHeader("Content-Disposition", "attachment; filename=test.xml");
    Response.End();
}

我一直在尝试各种不同的方法,但总是出错,所以我将如何将 DataSet 转换为 XML 部分留空。

另外,这个查询包含带有特殊字符的列。

【问题讨论】:

    标签: c# asp.net xml xml-serialization dataset


    【解决方案1】:

    试试这个。它对我有用。

    static XmlDocument xdoc = new XmlDocument(); //static; since i had to access this file someother place too
    protected void CreateXmlFile(DataSet ds) 
        {
          //ds contains sales details in this code; i.e list of products along with quantity and unit
          //You may change attribute acc to your needs ; i.e employee details in the below code
    
            string salemastid = lbl_salemastid.Text;
            int i = 0, j=0;
            String str = "salemastid:" + salemastid;
            DataTable dt = ds.Tables[0];
            string xml = "<Orders>" ;
             while (j < dt.Rows.Count)
             {
                 int slno = j + 1;
                 string sl = slno.ToString();
                 xml += "<SlNo>" + sl +"</SlNo>" +
                           "<PdtName>" + dt.Rows[j][0].ToString() + "</PdtName>" +
                           "<Unit>" + dt.Rows[j][1].ToString() + "</Unit>" +
                           "<Qty>" + dt.Rows[j][2].ToString() + "</Qty>";
                 j++;
             }
             xml += "</Orders>";
    
             xdoc.LoadXml(xml);
             //Here the xml is prepared and loaded in xml DOM.
    
             xdoc.Save(Server.MapPath("Newsales.xml"));
             //You may also use some other names instead of 'Newsales.xml'
    
             //to get a downloadable file use the below code
             System.IO.MemoryStream stream = new System.IO.MemoryStream();
                    XmlTextWriter xwriter = new XmlTextWriter(stream, System.Text.Encoding.UTF8);
    
                    xdoc.WriteTo(xwriter);
                    xwriter.Flush();
                    Response.Clear();
                    Encoding.UTF8.GetString(stream.ToArray());
                    byte[] byteArray = stream.ToArray();
                    Response.AppendHeader("Content-Disposition", "filename=OrderRequest.xml");
                    Response.AppendHeader("Content-Length", byteArray.Length.ToString());
                    Response.ContentType = "application/octet-stream";
                    Response.BinaryWrite(byteArray);
                    xwriter.Close();
                    stream.Close();
    
            } 
    

    【讨论】:

      【解决方案2】:

      如果 ds 是您的数据集..

      你可以使用:

      ds.getXml();
      

      这有助于获取 XML

      【讨论】:

      【解决方案3】:

      编写如下代码部分

      DataTable dt = new DataTable("MyData");
      dt.WriteXml(@Application.StartupPath + "\\DataBaseValues.xml");
      

      或者,您可以直接转换dataSet 也如 Oded 所说,

      private void WriteXmlToFile(DataSet thisDataSet)
      {
         if (thisDataSet == null) 
         {
            return;
         }
      
         // Create a file name to write to.
         string filename = "myXmlDoc.xml";
      
         // Create the FileStream to write with.
         System.IO.FileStream myFileStream = new System.IO.FileStream(filename, System.IO.FileMode.Create);
      
         // Create an XmlTextWriter with the fileStream.
         System.Xml.XmlTextWriter myXmlWriter = 
         new System.Xml.XmlTextWriter(myFileStream, System.Text.Encoding.Unicode);
      
         // Write to the file with the WriteXml method.
         thisDataSet.WriteXml(myXmlWriter);   
         myXmlWriter.Close();
      }
      

      【讨论】:

        【解决方案4】:

        只需使用Dataset.getXml():

        doc.LoadXml(ds.GetXml());
        

        【讨论】:

          【解决方案5】:

          您可以使用ds.WriteXml,但这需要您拥有Stream 才能将输出放入。如果你想输出一个字符串,试试这个扩展方法:

          public static class Extensions
          {
              public static string ToXml(this DataSet ds)
              {
                  using (var memoryStream = new MemoryStream())
                  {
                      using (TextWriter streamWriter = new StreamWriter(memoryStream))
                      {
                          var xmlSerializer = new XmlSerializer(typeof(DataSet));
                          xmlSerializer.Serialize(streamWriter, ds);
                          return Encoding.UTF8.GetString(memoryStream.ToArray());
                      }
                  }
              }
          }
          

          用法:

          var xmlString = ds.ToXml();
          // OR
          Response.Write(ds.ToXml());
          

          【讨论】:

          • 是的,这可行,但特殊字符显示为问号,有没有办法解决这个问题?
          • 这可能是因为 ASCII 编码。试试Encoding.UTF8。现在更新代码
          • ToArray() 你是说ToString()吗?
          【解决方案6】:

          我们也可以用这个

          私有函数 DsToXML(DataSet ds) as System.Xml.XmlDataDocument 将 xmlDoc 调暗为 System.Xml.XmlDataDocument 将 xmlDec 调暗为 System.Xml.XmlDeclaration 将 xmlWriter 调暗为 System.Xml.XmlWriter xmlWriter = 新 XmlTextWriter(context.Response.OutputStream,System.Text.Encoding.UTF8) xmlDoc = 新 System.Xml.XmlDataDocument(ds) xmlDoc.DataSet.EnforceConstraints = False xmlDec = xmlDoc.CreateXmlDeclaration("1.0", "UTF-8", Nothing) xmlDoc.PrependChild(xmlDec) xmlDoc.WriteTo(xmlWriter) 返回xmlDoc 结束运行

          【讨论】:

            【解决方案7】:

            使用DataSet.WriteXml - 它将数据集输出为 XML。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-01-06
              • 1970-01-01
              • 2011-09-07
              • 2022-01-20
              • 2021-03-25
              相关资源
              最近更新 更多