您的位置:首页 > 其它

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

2006-06-30 22:29 706 查看
经验总结]把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();

这些就是我这两天的心得。^_^
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: