积极答复者
请教怎么用DATASET获取Web Service传递过来的XML数据,并存入本地数据库。

问题
答案
-
只要是XML结构,就能够转化为 DataSet,如下:
Stream networkStream = response.GetResponseStream();
DataSet ds;
ds.ReadXml(networkStream);
- 已建议为答案 ThankfulHeart 2012年12月18日 8:55
- 已标记为答案 Decker Dong - MSFT 2012年12月23日 3:17
-
你提到的新问题并不是问题,而是你没有正确理解。在你的示例中,你只是用了索引为 0 的 DataTable,事实,通过你给出的XML数据,它最终转换为成为不止一个 DataTable,也就是为什么要用 DataSet 来读取的原因。
我们假设服务器返回 DataSet 的XML序列化结果,并且该 DataSet 包含多个 DataTable,那么你就能得到你的示例给出的 XML 数据。这是正确的。因为客户端可以通过它来还原为原来的 DataSet。
因此,我再补充一个国内厂商在此问题上的另一个诟病:只给XML数据,不提供XML元数据。
在你的示例中,同样你没有给出此 XML 数据来自 DataSet 类型,还是来自自定义对象类型,因此客户端是无法知道究竟该还原成什么,所以你错误的用了一个 DataSet,然后又错误的只使用了索引为 0 的 DataTable。
但是,XML 能够很好的和数据库中的表互相映射,因此,DataSet 才能把任何 XML 数据按照“表”的形式存储起来。
- 已建议为答案 ThankfulHeart 2012年12月18日 8:55
- 已标记为答案 Decker Dong - MSFT 2012年12月23日 3:17
全部回复
-
只要是XML结构,就能够转化为 DataSet,如下:
Stream networkStream = response.GetResponseStream();
DataSet ds;
ds.ReadXml(networkStream);
- 已建议为答案 ThankfulHeart 2012年12月18日 8:55
- 已标记为答案 Decker Dong - MSFT 2012年12月23日 3:17
-
@只要是XML结构,就能够转化为 DataSet
这个貌似太绝对了吧,呵呵……譬如你的Xml是:
<root>aaa</root>
<root2>bbb</root>
类似这种“多个头结点”的恐怕就无法转化读入DataSet了;再者,建议楼主最好按照这样的方式创建返回一个xml字符串以便加载入DataList。
<root> <row> <col1>value1</col1> <col2>value2</col2> </row> <row> <col1>value1</col1> <col2>value2</col2> </row> </root>
col1,col2分别是列名,你可以根据需要自定修改。
总结:
1)必须保证xml语法是正确的(譬如不允许多个头结点)。
2)同时建议按照“行列”方式加载。
3)如果无法正常读取,建议用Xml类获取数据(直接加载xml字符串也可以,XDocument用Parse方法,XmlDocument用LoadXml)。
-
DroidXgnaW呵呵,谢谢提醒。
不过似乎不是那么简单就一个xml的问题——即便你的Xml符合逻辑(语法接口规范),也不一定非常合适被读入成为“行”或者“列”——譬如这样的xml:
<root> <name>A</name> <age>26</age> <hobbies> <hobby>PingPang</hobby> <hobby>Video Game</hobby> </hobbies> </root>
因为这个xml中嵌套了一个复杂的hobbies(内部又具备自己的xml),因此直接使用类似的行列读法是无法获取的,譬如:
namespace CSharp { using System.Threading.Tasks; using System.Xml.Linq; using System.Linq; using System.Data; using System.Net; using System.Text; using System.IO; using System; using System.Collections.Generic; using System.Linq.Expressions; class Program { static void Main(string[] args) { DataSet ds = new DataSet(); ds.ReadXml("XMLFile1.xml"); foreach (DataRow row in ds.Tables[0].Rows) { foreach (DataColumn col in ds.Tables[0].Columns) { Console.WriteLine(row[col].ToString()); } Console.WriteLine("===="); } } } }
输出的结果为(注意第三行因为是嵌套复合标签,直接读取将会为0)
此时就我知道,你只能使用Xml操作类读取了。
所以建议能够形成比较规范的“行”/“列”的还请参照我上面的那个一般标准的xml。
欢迎进一步讨论;)
-
你提到的新问题并不是问题,而是你没有正确理解。在你的示例中,你只是用了索引为 0 的 DataTable,事实,通过你给出的XML数据,它最终转换为成为不止一个 DataTable,也就是为什么要用 DataSet 来读取的原因。
我们假设服务器返回 DataSet 的XML序列化结果,并且该 DataSet 包含多个 DataTable,那么你就能得到你的示例给出的 XML 数据。这是正确的。因为客户端可以通过它来还原为原来的 DataSet。
因此,我再补充一个国内厂商在此问题上的另一个诟病:只给XML数据,不提供XML元数据。
在你的示例中,同样你没有给出此 XML 数据来自 DataSet 类型,还是来自自定义对象类型,因此客户端是无法知道究竟该还原成什么,所以你错误的用了一个 DataSet,然后又错误的只使用了索引为 0 的 DataTable。
但是,XML 能够很好的和数据库中的表互相映射,因此,DataSet 才能把任何 XML 数据按照“表”的形式存储起来。
- 已建议为答案 ThankfulHeart 2012年12月18日 8:55
- 已标记为答案 Decker Dong - MSFT 2012年12月23日 3:17
-