【问题标题】:Populate Dataset with columns from XML使用 XML 中的列填充数据集
【发布时间】:2016-05-24 07:26:06
【问题描述】:

这是我目前所拥有的:

public void CreateObject()
{
    const string ServerURl = "http://services.odata.org/northwind/northwind.svc/Customers";

    DataSet ds = new DataSet();
    DataTable sourcetable = new DataTable();

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(ServerURl);

    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    richTextBox1.AppendText(response.StatusDescription);
    Stream datastream = response.GetResponseStream();
    StreamReader reader2 = new StreamReader(datastream);

    using (StreamReader mySR = new StreamReader(datastream, Encoding.GetEncoding("iso-8859-1")))
    {
        XmlDocument lgnXml = new XmlDocument();
        lgnXml.Load(mySR);
        XmlNodeReader reader = new XmlNodeReader(lgnXml);

        ds.ReadXml(reader);

        foreach (DataTable table in ds.Tables)
        {
            foreach (DataRow dr in table.Rows)
            {
                sourcetable.Rows.Add(dr.ItemArray);
            }
        }

        dataGridView1.DataSource = sourcetable;
    }
}

private void button1_Click(object sender, EventArgs e)
{
    CreateObject();
}

当我尝试运行它时,我得到了这个错误: 输入数组长于该表的列数

我猜我必须将列名添加到数据集或数据表中?我可以从 XML 中做到这一点吗?

编辑这是我使用 codeninja.sj 的方法运行它时的响应

+---+-------------------------------------------------------------+----------------------+
|   |                              id                             |       updated        |
+---+-------------------------------------------------------------+----------------------+
| 1 | http://services.odata.org/northwind/northwind.svc/Customers | 2016-02-15T20:21:21Z |
+---+-------------------------------------------------------------+----------------------

【问题讨论】:

    标签: c# xml winforms web-services api


    【解决方案1】:

    方法一:您必须在创建源数据表时定义列名及其数据类型

    DataTable sourcetable = new DataTable();
    sourcetable.Columns.Add("id", typeof(int));
    sourcetable.Columns.Add("ColumnName1", typeof(string));
    sourcetable.Columns.Add("ColumnName2", typeof(string));
    

    方法二: 将 API 响应转换为 XML 对象;和数据集一样转换

    string ServerURl = "http://localhost:53835/api/values";
    DataSet ds = new DataSet();            
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(ServerURl);
    request.ContentType = "application/xml";
    HttpWebResponse response = (HttpWebResponse)request.GetResponse();            
    var datastream = response.GetResponseStream();
    XmlReader reader = XmlReader.Create(datastream);
    ds.ReadXml(reader);
    dataGridView1.DataSource = ds.Tables[0]; //ds.Tables["properties"] --> Specify your XML Node Name here
    

    建议:第二种方法比第一种好;因为您可以为不同的 API 响应重用相同的代码

    注意:根据你的API响应修改上面的code-sn-ps

    【讨论】:

    • 我尝试了第二种方法,但我在 datagridview 中只得到了一行
    • @Sewder,你能分享你的 API 响应吗?
    • 我将其添加到问题中
    • @Sewder,不要将表索引值提到为零,而是将其作为 XML 节点名称,以在网格视图上显示。我想,在您的情况下,它必须是“客户”
    • 我刚看到Northwind API 数据响应,我猜,在你的情况下数据集表索引名称必须是properties
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    • 2013-04-15
    • 2016-06-28
    • 1970-01-01
    相关资源
    最近更新 更多