从数据库中读出一个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,再转成流,但读的时候还是出这个错。
真是奇哉怪也!实在是没辙了!
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,再转成流,但读的时候还是出这个错。
真是奇哉怪也!实在是没辙了!
如果你是使用WebService 建议使用ds.GetXML来传输字符串 就不用从流再转成字符串了
return ds.GetXml();string rtnString = 你的WebService返回的字符串
MemoryStream ms=new MemoryStream();
ds.WriteXml(ms);DataSet ds2 = new DataSet();
ds2.ReadXml(ms);
改为:ds2.ReadXml(ms,XmlReadMode.Auto);
代码:ds2.ReadXml(ms,XmlReadMode.ReadSchema);
改为:ds2.ReadXml(ms,XmlReadMode.Auto);我都试过了,都失败了,如果你搞出来,告诉我一下哈 谢谢了
QQ 18734997 验证写CSDN
Schema的问题我都试过了,可是还是不行,莫非我这个思路本身就是错误的?
ds.WriteXml(ms,XmlWriteMode.WriteSchema);ms.Position=0;DataSet ds2 = new DataSet();
ds2.ReadXml(ms,XmlReadMode.ReadSchema);
我刚才测试了一下,也出错了,报系统错误。查不出错来。
不过那样做是行的通的。
我以前封装过一个加密解密XML文件的类,
我就是用DataSet 对 MemoryStream 流加密后写到文件的。
不行你就试试先把流给加密了 再传 再解密 再读
后加上 ms.Position=0;这样子就行得通了
你可以试试
ms.Position=0;直接读取同一个流是可以了,但经过Socket传送后读到一个新的流里,又出现了同样的错误;
另外试用base64编码,解码后也是一样。junsir说的加密解密是怎样做的?哇!我要晕啦!
把socket 流的那部分 贴出来叫看看
类似的问题。不过我是希望从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);
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{}
<?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,是不是还要加点什么?
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);
http://community.csdn.net/Expert/topic/5056/5056724.xml?temp=.41914
可以到这里接分。
ds.ReadXml应该提供一个从字符串加载的功能。这样几次转换确实比较麻烦。
XmlStream.Position = 0;
ds.ReadXml(XmlStream,XmlReadMode
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();