经验总结]把string转化为stream,把一个xmlstring片断转化为dataset,导致写入stream的东西读不出来等

来源:互联网 发布:node cluster 编辑:程序博客网 时间:2024/04/28 19:33
经验总结]把string转化为stream,把一个xmlstring片断转化为dataset,导致写入stream的东西读不出来等

昨天写的有问题,其实原来是同事的一个问题,同事想把一个从别处获得的string,转化成dataset,并且这个string是xml结构的,所以解决就有2种:
1.直接用XML解析这个xml string,一个结点一个结点的解析,构建一个datatable,各个cloumn,构建一个个的datarow,呵呵,同事写了一个好长的方法。先构造出一个个的column,然后再重新读这个字符串,解析各个结点,填充这个datatable.方法至少是比较麻烦,但效果是不是好,不是太清楚。
2.因为string是xml格式的,而dataset有一个readXml()方法,可以把xml转化为dataset,dataset的readxml需要的参数中没有直接是一个string,但有stream,XmlReader,string(here is filepath),TextReader,这里不可能用string了,因为不可能先写一个临时文件再读进来,再删了,过于麻烦。
其它的方法,就是获得stream或reader了。
如何从一个string得到一个stream.
原理我有:就是先构建一个Stream,然后构建一个基于stream的streamwriter,然后用这个streamwriter往这个stream写这个xml的string,这样就构造了一个stream.
因为可直接构造的stream,只有派生的memorystream,所以就用了memorystream.但我发现,这个方法根本不可用,但我调试跟踪的时候却实实在在的发现里面有值。但用streamreader之类的却读不出来值。晕!最后在CSDN上发了一个帖子,才发现原因,这里在stream里有一个类似handle的概念,在我用streamwriter的时候,这个读写指针所在的位置就已经不是在开始的位置了,所以读的时候,就会从现在的位置开始,故读取的只是这个位置之后的,所以就为空了。解决现在如下:
MemoryStream ms=new MemoryStream();StreamWeader sw=new StreamWeader(ms);sw.Write("tavorunknown2004-01-02");sw.Flush();sw.Position=0;//这个是关键的,也是我刚才出错的地方。DataSet ds=new DataSet();ds.ReadXml(ms);................... 


另一种解决方法是我在查了N多的MSDN才找到的。可以在ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfsystemxmlxmltextreaderclassctortopic.htm里找到
用于从字符串转化为XML片段,然后从中得到DATASET,完成数据绑定。实现过程如下:
string xmlFrag =" " +"" +"novel" +""//Create the XmlNamespaceManager.NameTable nt = new NameTable();XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt);nsmgr.AddNamespace("bk", "urn:sample");//Create the XmlParserContext.XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None);//Create the reader.XmlTextReader reader = new XmlTextReader(xmlFrag, XmlNodeType.Element, context);DataSet ds;ds.ReadXml(reader);this.DataGrid1.DataSource=ds;this.DataGrid1.DataBind(); 



而在实际应用中,可以直接用如下语句来达到效果。
string myxml;//一个已有值的XML字符串XmlParserContect context=new XmlParserContext(null,null,null,XmpSpace.None);XmlTextReader reader=new XmlTextReader(myxml,XmlNodeType.Element,context);DataSet ds;ds.ReadXml(reader); 

通过上面的两个方法,然后再用下面的方法就可以了。
this.DataGrid1.DataSource=ds;this.DataGrid1.DataBind(); 

这些就是我这两天的心得。^_^ 
原创粉丝点击