none
请教怎么用DATASET获取Web Service传递过来的XML数据,并存入本地数据库。 RRS feed

答案

  • 只要是XML结构,就能够转化为 DataSet,如下:

    Stream networkStream = response.GetResponseStream();

    DataSet ds;

    ds.ReadXml(networkStream);

    2012年12月18日 1:35
  • 你提到的新问题并不是问题,而是你没有正确理解。在你的示例中,你只是用了索引为 0 的 DataTable,事实,通过你给出的XML数据,它最终转换为成为不止一个 DataTable,也就是为什么要用 DataSet 来读取的原因。

    我们假设服务器返回 DataSet 的XML序列化结果,并且该 DataSet 包含多个 DataTable,那么你就能得到你的示例给出的 XML 数据。这是正确的。因为客户端可以通过它来还原为原来的 DataSet。

    因此,我再补充一个国内厂商在此问题上的另一个诟病:只给XML数据,不提供XML元数据。

    在你的示例中,同样你没有给出此 XML 数据来自 DataSet 类型,还是来自自定义对象类型,因此客户端是无法知道究竟该还原成什么,所以你错误的用了一个 DataSet,然后又错误的只使用了索引为 0 的 DataTable。

    但是,XML 能够很好的和数据库中的表互相映射,因此,DataSet 才能把任何 XML 数据按照“表”的形式存储起来。

    2012年12月18日 8:53

全部回复

  • 首先说明,不是每一个Xml都可以使用DataSet.ReadXml转化成DataTable或者DataSet的。必须符合一定条件的才可以转换。

    其次,如果你无法转换,建议使用XDocument或者XmlDocument读取xml文件中需要的数据,然后借助SqlCommand进行保存入库。


    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    2012年12月18日 1:15
  • 只要是XML结构,就能够转化为 DataSet,如下:

    Stream networkStream = response.GetResponseStream();

    DataSet ds;

    ds.ReadXml(networkStream);

    2012年12月18日 1:35
  • @只要是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)。


    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    2012年12月18日 2:43
  • XML规范明确了只能有一个 ROOT 节点,请不要用国内厂商中不规范的接口定义来举例,我希望大家从小就培养出按照标准来设计接口的习惯。
    2012年12月18日 3:32
  • 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。

    欢迎进一步讨论;)


    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    2012年12月18日 5:24
  • 你提到的新问题并不是问题,而是你没有正确理解。在你的示例中,你只是用了索引为 0 的 DataTable,事实,通过你给出的XML数据,它最终转换为成为不止一个 DataTable,也就是为什么要用 DataSet 来读取的原因。

    我们假设服务器返回 DataSet 的XML序列化结果,并且该 DataSet 包含多个 DataTable,那么你就能得到你的示例给出的 XML 数据。这是正确的。因为客户端可以通过它来还原为原来的 DataSet。

    因此,我再补充一个国内厂商在此问题上的另一个诟病:只给XML数据,不提供XML元数据。

    在你的示例中,同样你没有给出此 XML 数据来自 DataSet 类型,还是来自自定义对象类型,因此客户端是无法知道究竟该还原成什么,所以你错误的用了一个 DataSet,然后又错误的只使用了索引为 0 的 DataTable。

    但是,XML 能够很好的和数据库中的表互相映射,因此,DataSet 才能把任何 XML 数据按照“表”的形式存储起来。

    2012年12月18日 8:53
  • 哦,我明白你的意思了,可以告诉我你的QQ吗?(我的个人mail:maledong_work@foxmail.com),谢谢!

    我的博客园
    慈善点击,点击此处
    和谐拯救危机,全集下载,净化人心

    2012年12月18日 8:56