Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在新的XmlRecordsetWriter for Streams中实现XmlTextWriter_C#_Xml_Dataset_Recordset - Fatal编程技术网

C# 在新的XmlRecordsetWriter for Streams中实现XmlTextWriter

C# 在新的XmlRecordsetWriter for Streams中实现XmlTextWriter,c#,xml,dataset,recordset,C#,Xml,Dataset,Recordset,背景见我的问题 因此,现在的问题不是我不能将数据集发送到经典ASP,而是它不能用它做任何事情。因此,我找到了一些代码,可以从数据集创建记录集xml结构 我对它的原版做了一些调整。问题是,我似乎无法提取基本流并使用它,而不必写入文件。我错过了什么 下面是我如何尝试测试该类: [Test] public void TestWriteToStream() { MemoryStream theStream = new MemoryStream();

背景见我的问题

因此,现在的问题不是我不能将
数据集
发送到经典ASP,而是它不能用它做任何事情。因此,我找到了一些代码,可以从
数据集
创建记录集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);
    }
这是我的班级:

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;
是冗余的,因为
MemoryStream
应该已经是写入程序的基本流

听起来你想要的只是:

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字符串,您可以将其加载到
XPathDocument
XmlDocument
中,并根据需要进行处理。

我认为您需要处理基于数据的对象和基于xml的数据。 如果这是真的,我建议使用
ADODB
类(它在COM引用中:MicrosoftActiveX数据对象6.0库-或其他版本,如2.8-)

您可以通过以下代码将
DataTable
转换为
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);
我希望它能起作用!,实际上,我写这个答案是为了以后完成它,如果我的方向正确的话