2016-02-13 267 views
2

这里列是我到目前为止有:填充数据集从XML

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 | 
+---+-------------------------------------------------------------+---------------------- 

回答

4

方法1:你必须定义的列名,并在创建源数据表的数据类型

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

方法2:转换为XML对象的API响应;并转换成相同的数据集

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响应

+0

我尝试了第二种方法,我只在DataGridView有一行回 – Sewder

+0

@Sewder,可以分享你的API响应吗? –

+0

我将它添加到问题 – Sewder