在新的XmlRecordsetWriter中为Streams实现XmlTextWriter

问题描述:

有关背景信息,请参阅我的问题here在新的XmlRecordsetWriter中为Streams实现XmlTextWriter

所以现在的问题不是我不能发送DataSet经典的ASP,但它不能做任何事情。所以我发现一些代码可以从DataSet创建记录集xml结构。

我调整了一下它的原始source。问题是我似乎无法提取基本流并使用它,而不必写入文件。我错过了什么?

这里是我正在试图测试类:

[Test] 
    public void TestWriteToStream() 
    {    
     MemoryStream theStream = new MemoryStream(); 
     XmlRecordsetWriter theWriter = new XmlRecordsetWriter(theStream); 
     theWriter.WriteRecordset(SomeFunctionThatReturnsADataSet()); 
     theStream = (MemoryStream)theWriter.BaseStream; 
     string xmlizedString = UTF8ByteArrayToString(theStream.ToArray()); 
     xmlizedString = xmlizedString.Substring(1); 

     //Assert.AreEqual(m_XMLNotNull, xmlizedString); 
     Console.WriteLine(xmlizedString); 
    } 

这里是我的类:

using System; 
using System.Collections.Generic; 
using System.Data; 
using System.IO; 
using System.Text; 
using System.Xml; 

namespace Core{ 

public class XmlRecordsetWriter : XmlTextWriter 
{ 
    #region Constructors 
    // Constructor(s) 
    public XmlRecordsetWriter(string filename) : base(filename, null) { SetupWriter(); } 

    public XmlRecordsetWriter(Stream s) : base(s, null) { SetupWriter(); } 

    public XmlRecordsetWriter(TextWriter tw) : base(tw) { SetupWriter(); } 

    protected void SetupWriter() 
    { 
     base.Formatting = Formatting.Indented; 
     base.Indentation = 3; 
    } 
    #endregion 

    #region Methods 

    // WriteRecordset 
    public void WriteRecordset(DataSet ds) { WriteRecordset(ds.Tables[0]); } 

    public void WriteRecordset(DataSet ds, string tableName) { WriteRecordset(ds.Tables[tableName]); } 

    public void WriteRecordset(DataView dv) { WriteRecordset(dv.Table); } 

    public void WriteRecordset(DataTable dt) 
    { 
     WriteStartDocument(); 
     WriteSchema(dt); 
     WriteContent(dt); 
     WriteEndDocument(); 
    } 

    // WriteStartDocument 
    public void WriteStartDocument() 
    { 
     base.WriteStartDocument(); 
     base.WriteComment("Created by XmlRecordsetWriter"); 

     base.WriteStartElement("xml"); 
     base.WriteAttributeString("xmlns", "s", null, "uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882"); 
     base.WriteAttributeString("xmlns", "dt", null, "uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"); 
     base.WriteAttributeString("xmlns", "rs", null, "urn:schemas-microsoft-com:rowset"); 
     base.WriteAttributeString("xmlns", "z", null, "#RowsetSchema"); 
    } 

    // WriteSchema 
    public void WriteSchema(DataSet ds) { WriteSchema(ds.Tables[0]); } 

    public void WriteSchema(DataSet ds, string tableName) { WriteSchema(ds.Tables[tableName]); } 

    public void WriteSchema(DataView dv){ WriteSchema(dv.Table); } 

    public void WriteSchema(DataTable dt) 
    { 
     // Open the schema tag (XDR) 
     base.WriteStartElement("s", "Schema", null); 
     base.WriteAttributeString("id", "RowsetSchema"); 
     base.WriteStartElement("s", "ElementType", null); 
     base.WriteAttributeString("name", "row"); 
     base.WriteAttributeString("content", "eltOnly"); 

     // Write the column info 
     int index=0; 
     foreach(DataColumn dc in dt.Columns) 
     { 
      index ++; 
      base.WriteStartElement("s", "AttributeType", null); 
      base.WriteAttributeString("name", dc.ColumnName); 
      base.WriteAttributeString("rs", "number", null, index.ToString()); 
      base.WriteEndElement(); 
     } 

     // Close the schema tag 
     base.WriteStartElement("s", "extends", null); 
     base.WriteAttributeString("type", "rs:rowbase"); 
     base.WriteEndElement(); 
     base.WriteEndElement(); 
     base.WriteEndElement(); 
    } 

    // WriteContent 
    public void WriteContent(DataSet ds) { WriteContent(ds.Tables[0]); } 

    public void WriteContent(DataSet ds, string tableName) { WriteContent(ds.Tables[tableName]); } 

    public void WriteContent(DataView dv) { WriteContent(dv.Table); } 

    public void WriteContent(DataTable dt) 
    { 
     // Write data 
     base.WriteStartElement("rs", "data", null); 
     foreach(DataRow row in dt.Rows) 
     { 
      base.WriteStartElement("z", "row", null); 
      foreach(DataColumn dc in dt.Columns) 
       base.WriteAttributeString(dc.ColumnName, row[dc.ColumnName].ToString()); 
      base.WriteEndElement(); 
     } 
     base.WriteEndElement(); 
    } 

    // WriteEndDocument 
    public void WriteEndDocument() 
    { 
     base.WriteEndDocument(); 
     base.Flush(); 
     base.Close(); 
    } 
    #endregion 
} 

}

首先,该行:

theStream = (MemoryStream)theWriter.BaseStream; 

与是多余的应该已经是作者的基本流。

像你想它听起来就是:

theWriter.Close(); 
theStream.Position = 0; // So you can start reading from the begining 

string xml = null; 
using (StringReader read = new StringReader(theStream)) 
{ 
    xml = read.ReadToEnd(); 
} 

然后XML将成为你的XML字符串,你可以加载到XPathDocumentXmlDocument与不过你想要玩。

我想你想使用基于数据的对象和基于XML的数据。 如果是这样,我建议使用ADODB类(它是在COM参考:Microsoft ActiveX数据对象6.0库 - 或在其他版本如2.8-)。

您可以通过此代码将您的DataTable转换为ADODB.RecordsetSimplest code to convert an ADO.NET DataTable to an ADODB.Recordset。 所以你有一个ConvertToRecordset()方法在下一个代码中使用。

现在,你只需要save()方法让你的XML文件:

using ADODB; 
using System; 
using System.Data; 
using System.IO; 

namespace ConsoleApplicationTests 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Recordset rs = new Recordset(); 
      DataTable dt = sampleDataTable(); //-i. -> SomeFunctionThatReturnsADataTable() 

      //-i. Convert DataTable to Recordset 
      rs = ConvertToRecordset(dt); 

      //-i. Sample Output File 
      String filename = @"C:\yourXMLfile.xml"; 
      FileStream fstream = new FileStream(filename, FileMode.Create); 

      rs.Save(fstream, PersistFormatEnum.adPersistXML); 
     } 
    } 
} 

ADODB.Recordset的力量是在这里,你可以打开保存的XML文件非常简单:

rs.Open(fstream); 

我希望它工作!,其实我写了这个答案,以便稍后完成它,如果我在一个正确的方向。