从数据库中读出一个DataSet ds,然后读到一个流ms里
MemoryStream ms=new MemoryStream();
ds.WriteXml(ms,XmlWriteMode.WriteSchema);用另一个ds2来读取这个流
DataSet ds2 = new DataSet();
ds2.ReadXml(ms,XmlReadMode.ReadSchema);
总是提示“缺少根元素”的错误。但前面WriteXml如果保存到一个xml文件里,ReadXml从这个文件来读取就没有问题。
把ms转换成字符串和文件里内容比较发现文件里多了<?xml version="1.0" standalone="yes"?>这句,以为是这个问题,于是用了另一种方法,直接用Xml字符串转换到流里面来测试,结果还是出错。
后来又换了另一种方法,使用XmlTextWriter先格式化Xml,再转成流,但读的时候还是出这个错。
真是奇哉怪也!实在是没辙了!

解决方案 »

  1.   

    我昨天也遇到了这个问题
    如果你是使用WebService 建议使用ds.GetXML来传输字符串 就不用从流再转成字符串了
      

  2.   

    DataSet ds = this.LoadDataSet(sqlString);
    return ds.GetXml();string rtnString = 你的WebService返回的字符串
      

  3.   

    试试
    MemoryStream ms=new MemoryStream();
    ds.WriteXml(ms);DataSet ds2 = new DataSet();
    ds2.ReadXml(ms);
      

  4.   

    代码:ds2.ReadXml(ms,XmlReadMode.ReadSchema);
    改为:ds2.ReadXml(ms,XmlReadMode.Auto);
      

  5.   

    ReadSchema 读取任何内联架构并加载数据。如果 DataSet 已经包含架构,则可以将新表添加到架构中,但是如果内联架构中的任何表在 DataSet 中已经存在,则会引发异常。
      

  6.   

    MemoryStream 
    代码:ds2.ReadXml(ms,XmlReadMode.ReadSchema);
    改为:ds2.ReadXml(ms,XmlReadMode.Auto);我都试过了,都失败了,如果你搞出来,告诉我一下哈 谢谢了
    QQ 18734997 验证写CSDN
      

  7.   

    我现在遇到的问题是不会把返回的XML格式的字符串绑定到GridView上
      

  8.   

    我是想把DataSet变成Xml通过Socket传送,然后再读出了。
    Schema的问题我都试过了,可是还是不行,莫非我这个思路本身就是错误的?
      

  9.   

    MemoryStream ms=new MemoryStream();
    ds.WriteXml(ms,XmlWriteMode.WriteSchema);ms.Position=0;DataSet ds2 = new DataSet();
    ds2.ReadXml(ms,XmlReadMode.ReadSchema);
      

  10.   

    你的思路没错
    我刚才测试了一下,也出错了,报系统错误。查不出错来。
    不过那样做是行的通的。
    我以前封装过一个加密解密XML文件的类,
    我就是用DataSet 对 MemoryStream 流加密后写到文件的。
    不行你就试试先把流给加密了 再传  再解密 再读
      

  11.   

    在ds.WriteXml(ms,XmlWriteMode.WriteSchema);
    后加上 ms.Position=0;这样子就行得通了
    你可以试试
      

  12.   

    刚才又试了楼上几位的方法
    ms.Position=0;直接读取同一个流是可以了,但经过Socket传送后读到一个新的流里,又出现了同样的错误;
    另外试用base64编码,解码后也是一样。junsir说的加密解密是怎样做的?哇!我要晕啦!
      

  13.   

    可能只是个 细节错误
    把socket 流的那部分 贴出来叫看看
      

  14.   

    http://community.csdn.net/Expert/topic/5056/5056724.xml?temp=.41914
    类似的问题。不过我是希望从STRING中读取信息再读入到dataSet里去。但不允许中文,即使是用了utf-8写入信息。好像用Byte接收后就有问题了。string strTxt = GetTxt("aa.xml");//从XML文件中读取UTF8编码的字符串。
    Byte[] buffer = new byte[strTxt.Length];
    for (int s = 0; s < strTxt.Length; s++)
    {
    buffer[s] = (byte)strTxt[s];
    }
    MemoryStream stream = new MemoryStream(buffer);
    ds.ReadXml(stream);
      

  15.   

    我强烈建议你将读出的XML文本load进一个XMLDOC这样操作简单明了
      

  16.   

    另外XML里有中文时,DS读取会报具体哪行字符错误。
      

  17.   

    我对xml使用XmlTextWriter处理成了GB2312,应该不会是中文的问题,把中文换成其他字符也是报同样的错误哟。
      

  18.   

    费死个牛劲给你个 直接传dataSet的方法
    MemoryStream ms=new MemoryStream();
    BinaryFormatter formatter = new BinaryFormatter();
    try {formatter.Serialize(fs, ds);}catch{}
    //
    //解
    DataSet ds;
    try{
        BinaryFormatter formatter = new BinaryFormatter();
        ds= (DataSet) formatter.Deserialize(inputStream);
        }catch{}
      

  19.   

    Socket发送和接收的流转成字符串是相同的,都是
    <?xml version=\"1.0\" encoding=\"gb2312\"?>\r\n<NewDataSet>\r\n      <xs:schema id=\"NewDataSet\" xmlns=\"\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\r\n            <xs:element name=\"NewDataSet\" msdata:IsDataSet=\"true\" msdata:Locale=\"zh-CN\">\r\n                  <xs:complexType>\r\n                        <xs:choice maxOccurs=\"unbounded\">\r\n                              <xs:element name=\"Table\">\r\n                                    <xs:complexType>\r\n                                          <xs:sequence>\r\n                                                <xs:element name=\"id\" type=\"xs:int\" minOccurs=\"0\" />\r\n                                                <xs:element name=\"name\" type=\"xs:string\" minOccurs=\"0\" />\r\n                                          </xs:sequence>\r\n                                    </xs:complexType>\r\n                              </xs:element>\r\n                        </xs:choice>\r\n       
               </xs:complexType>\r\n            </xs:element>\r\n      </xs:schema>\r\n      <Table>\r\n            <id>1</id>\r\n            <name>张三</name>\r\n      </Table>\r\n      <Table>\r\n            <id>2</id>\r\n            <name>李四</name>\r\n      </Table>\r\n</NewDataSet>我想可能还是流本身哪里有什么小问题被忽略了,比如cancerser(都是混饭吃,记得要结帖)老兄所说的ms.Position=0,是不是还要加点什么?
      

  20.   

    cancerser(都是混饭吃,记得要结帖)老兄的 BinaryFormatter 方法我还没试,应该行得通,只是我考虑用Xml就比较通用些,客户端就可以跨平台。
      

  21.   

    用了个比较恶心的方法,这次可以了
    string Xml = Encoding.Default.GetString(buf);
    DataSet ds = new DataSet();
    XmlDocument xd = new XmlDocument();
    xd.LoadXml(Xml);
    MemoryStream XmlStream = new MemoryStream();
    xd.Save(XmlStream);
    XmlStream.Position = 0;
    ds.ReadXml(XmlStream,XmlReadMode.ReadSchema);
      

  22.   

    我的问题用你的办法也解决了。多谢。
    http://community.csdn.net/Expert/topic/5056/5056724.xml?temp=.41914
    可以到这里接分。
    ds.ReadXml应该提供一个从字符串加载的功能。这样几次转换确实比较麻烦。
      

  23.   

    xd.Save(XmlStream);
    XmlStream.Position = 0;
    ds.ReadXml(XmlStream,XmlReadMode
      

  24.   

    是你写得有问题,其实只要在ReadXml时候,重新指定一下Position即可。例如:
    MemoryStream ms = new MemoryStream();
    ds.WriteXml( ms, XmlWriteMode.WriteSchema );
    ms.Flush();
    ms.Position = 0;//Reset positionDataSet dsNew = new DataSet();
    dsNew.ReadXml( ms, XmlReadMode.ReadSchema );
    foreach( DataRow drItem in dsNew.Tables[0].Rows )
    {
         //Get datarow
    }
    //Release resources
    dsNew.Dispose();
    ms.Close();