silverlight 中 支持datatable写法
来源:互联网 发布:春秋战国士阶层 知乎 编辑:程序博客网 时间:2024/05/01 15:57
我们的WebService接收到的DataSet类型默认会被替换成ArrayOfXElement类型,该类型下有两个节点,
第一个结点为表结构的,包含了表的各个列,示例如下:
- <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
- <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:UseCurrentLocale="true">
- <xs:complexType>
- <xs:choice minOccurs="0" maxOccurs="unbounded">
- <xs:element name="Table">
- <xs:complexType>
- <xs:sequence>
- <xs:element name="第一列列名" type="xs:string" minOccurs="0" />
- .............
- </xs:sequence>
- </xs:complexType>
- </xs:element>
- </xs:choice>
- </xs:complexType>
- </xs:element>
- </xs:schema>
第二个节点是表内容了
- <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1">
- <NewDataSet xmlns="">
- <Table diffgr:id="Table1" msdata:rowOrder="0">
- <USERID>988</USERID>
- ............
- </Table>
- <Table diffgr:id="Table1" msdata:rowOrder="0">
- <USERID>989</USERID>
- ............
- </Table>
- </NewDataSet>
- </diffgr:diffgram>
从表中提取数据解析并且放入实体类对象中非常麻烦,因此想出了一个投机取巧的办法。
我发现<Table>标签中的内容,跟实体类对象序列化xml的结果是一样儿一样儿的。
我猜测,我将其提取出来并拼接成一个完整的实体对象序列化后的xml,然后将其反序列化成对象。。。。是可行的!
经实验,确实可行。下面是代码,一个通用类的代码。
- public class Command
- {
- static string head = "<?xml version=\"1.0\"?><{0} xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">";
- static string tail = "</{0}>";
- /// <summary>
- /// 讲ArrayOfXElement类型中的结点内容反序列化为一个实体对象,实体类型可变
- /// </summary>
- /// <typeparam name="T">实体类型</typeparam>
- /// <param name="aoxe">WebService返回的DataSet类型的替代类型</param>
- /// <returns></returns>
- public static T GetEntityForDataSetXml<T>(ArrayOfXElement aoxe)
- {
- T t = default(T);
- try
- {
- var content = (XElement)((XElement)((XElement)aoxe.Nodes[1].LastNode).FirstNode);//提取第2个结点的内容
- StringBuilder sb = new StringBuilder();
- sb.Append(string.Format(head, typeof(T).Name));//添加xml头
- foreach (var item in content.Nodes())//便利结点
- {
- sb.Append(item.ToString());//取出内容
- }
- sb.Append(string.Format(tail, typeof(T).Name));//添加结尾
- string ss = sb.ToString();
- StringReader sr = new StringReader(ss);//创建流,这是序列化必须的
- //声明序列化对象实例serializer
- XmlSerializer serializer = new XmlSerializer(typeof(T));
- //反序列化,并将反序列化结果值赋给变量i
- t = (T)serializer.Deserialize(sr);//反序列化后强制转化为对象
- sr.Close();
- sr.Dispose();
- sb.Clear();
- }
- catch
- {
- }
- return t;
- }
- /// <summary>
- /// 获取多个实体对象
- /// </summary>
- /// <typeparam name="T">实体类型</typeparam>
- /// <param name="aoxe"></param>
- /// <returns></returns>
- public static List<T> GetAllEntitiesForDataSetXml<T>(ArrayOfXElement aoxe)
- {
- List<T> listT = new List<T>();
- XmlSerializer serializer = new XmlSerializer(typeof(T));
- T t = default(T);
- try
- {
- var content = (XElement)((XElement)((XElement)aoxe.Nodes[1].LastNode));//取出第二个结点中的内容
- StringBuilder sb = new StringBuilder();
- foreach (var item in content.Nodes())
- {
- sb.Append(string.Format(head, typeof(T).Name));
- foreach (var obj in ((XElement)item).Nodes())
- {
- sb.Append(obj.ToString());
- }
- sb.Append(string.Format(tail, typeof(T).Name));
- string ss = sb.ToString();
- StringReader sr = new StringReader(ss);
- //反序列化,并将反序列化结果值赋给变量i
- t = (T)serializer.Deserialize(sr);
- listT.Add(t);
- sr.Close();
- sr.Dispose();
- sb.Clear();
- }
- }
- catch
- {
- }
- return listT;
- }
- }
注意事项,对应的表需要对应的实体类型,实体类型中包含表的字段,
且实体类中的需要加上点东西,如下:
- [XmlRoot]
- public class UserInfo
- {
- [XmlElement]
- public string USERID { get; set; }
- ...........
- }
这里的UserInfo也就是上面泛型方法中的的T。。。。第一个返回的是类型为T的对象,第二个返回的是List<T>.....
0 0
- silverlight 中 支持datatable写法
- Silverlight - DataTable
- Silverlight传递DataTable终极解决方案
- Silverlight 不支持Datatable 杯具
- Silverlight 2.0的开发工具 and 中文字支持
- Silverlight 2.0的开发工具 and 中文字支持
- 在 Silverlight 应用程序中实现对 FLV 视频格式的支持
- Silverlight中的多语言支持中几个特殊之处
- Entity Framework 支持 DataTable
- silverlight中的回调写法
- Silverlight支持XPS
- php 支持 asp 写法
- DataTable 添加行的两种写法
- 在Dorado未支持Datatable中自动换行功能之前的解决办法
- NOKIA支持SILVERLIGHT之我见
- 配置iis以支持Silverlight
- DoubleClick 开始支持 SilverLight 广告
- Silverlight如何支持多语言
- facebook 开源项目
- 喜欢你
- .net 导出Excel
- Android APP OPS移除应用程序项目的修改方法
- nginx+terracotta+freemarker集群
- silverlight 中 支持datatable写法
- WebSphere部署应用后,访问页面处于loading状态。
- linux下vi命令
- 字体闪动的特效!
- C++ 中判断非空的错误指针
- OCP-1Z0-053-200题-50题-628
- Ubuntu 字体安装
- wifi 简单介绍
- 一些模板的写法