在Streams的新XmlRecordsetWriter中实现XmlTextWriter [英] Implementing XmlTextWriter in new XmlRecordsetWriter for Streams

查看:139
本文介绍了在Streams的新XmlRecordsetWriter中实现XmlTextWriter的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

对于背景,请参阅我的问题这里



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



我已经调整了一点它是原始的来源。问题是我似乎无法提取基本流并使用它而不是写入文件。我缺少什么?



这是我如何测试课程:

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

这是我的课程:

 使用系统; 
使用System.Collections.Generic;
使用System.Data;
使用System.IO;
使用System.Text;
使用System.Xml;

命名空间Core {

public class XmlRecordsetWriter:XmlTextWriter
{
#region构造函数
//构造函数
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方法

// 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(由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)
{
//打开模式标签(XDR)
base.WriteStartElement(s,Schema空值);
base.WriteAttributeString(id,RowsetSchema);
base.WriteStartElement(s,ElementType,null);
base.WriteAttributeString(name,row);
base.WriteAttributeString(content,eltOnly);

//写列info
int index = 0;
foreach(dt.Columns中的DataColumn dc)
{
index ++;
base.WriteStartElement(s,AttributeType,null);
base.WriteAttributeString(name,dc.ColumnName);
base.WriteAttributeString(rs,number,null,index.ToString());
base.WriteEndElement();
}

//关闭模式标签
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)
{
//写入数据
base.WriteStartElement(rs,data,null);
foreach(dt.Rows中的DataRow行)
{
base.WriteStartElement(z,row,null);
foreach(dt.Columns中的DataColumn dc)
base.WriteAttributeString(dc.ColumnName,row [dc.ColumnName] .ToString());
base.WriteEndElement();
}
base.WriteEndElement();
}

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

}

解决方案

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

您可以将 DataTable 转换为 ADODB.Recordset 通过以下代码:最简单将ADO.NET DataTable转换为ADODB.Recordset的代码
所以你有一个 ConvertToRecordset()方法用于下一个代码。



现在你只需要 save()方法来获取您的XML文件:

 使用ADODB; 
使用系统;
使用System.Data;
使用System.IO;

命名空间ConsoleApplicationTests
{
类程序
{
static void Main(string [] args)
{
Recordset rs = new Recordset();
DataTable dt = sampleDataTable(); //-一世。 - > SomeFunctionThatReturnsADataTable()

// - 我。将DataTable转换为Recordset
rs = ConvertToRecordset(dt);

// - 我。示例输出文件
String filename = @C:\yourXMLfile.xml;
FileStream fstream = new FileStream(filename,FileMode.Create);

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

ADODB.Recordset 在这里,您可以轻松打开保存的XML文件:

 打开(fstream); 

我希望它的工作原理!实际上我写了这个答案,以完成它,如果我在一个正确的方向。


For background see my question here.

So the problem now isn't that I can't send a DataSet to classic ASP but that it can't do anything with it. So I found some code to create a recordset xml structure from a DataSet.

I have tweaked it a little from it's original source. The problem is that I can't seem to extract the base stream and use it instead of having to write to a file. What am I missing?

Here is how I am trying to test the class:

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

Here is my class:

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
}

}

解决方案

I think you want to work with Data-based objects and XML based data. If it's true, I suggest using ADODB Classes (It is in COM References: Microsoft ActiveX Data Objects 6.0 Library -Or in other versions like 2.8-).

You can convert your DataTable to a ADODB.Recordset by this code: Simplest code to convert an ADO.NET DataTable to an ADODB.Recordset. So you have a ConvertToRecordset() method to use in next code.

Now you need only save() method to have your XML file:

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

The power of ADODB.Recordset is here that you can open that saved XML file very easy:

rs.Open(fstream);

I hope it works!, Actually I wrote this answer to complete it later and if I'm in a right direction.

这篇关于在Streams的新XmlRecordsetWriter中实现XmlTextWriter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆