2011-12-18 28 views
1

我想讀一個簡單的Web服務(REST)和填充在我的C#桌面應用程序下拉框。我; M用.NET 2.0轉換XML文檔中的數據表在C#中

以下是我的web服務返回XML

<sections type="array"> 
<section> 
    <name>Standing</name> 
    <created-at type="datetime">2011-10-23T23:17:54+05:30</created-at> 
    <updated-at type="datetime">2011-10-23T23:17:54+05:30</updated-at> 
    <id type="integer">1</id> 
    <status type="integer">1</status> 
    <service-charge type="float">0.0</service-charge> 
</section> 
<section> 
    <name>VIP</name> 
    <created-at type="datetime">2011-10-30T11:27:05+05:30</created-at> 
    <updated-at type="datetime">2011-10-30T11:27:05+05:30</updated-at> 
    <id type="integer">2</id> 
    <status type="integer">1</status> 
    <service-charge type="float">10.0</service-charge> 
</section> 

,並在下面的代碼我試圖將XML文檔轉換爲數據表

public DataTable getSections() { 
    String url = "http://<site_url>/sections.xml"; 
    DataTable t = new DataTable(); 
    HttpHandler handle = new HttpHandler(); 
    StreamReader sr = handle.executeGET(url); 
    String xml = ""; 
    while (sr.Peek() >= 0) 
    { 
     xml += sr.ReadLine(); 
    } 
    XmlDataDocument doc = new XmlDataDocument(); 
    doc.LoadXml(xml); 
    XmlReader xmlReader = new XmlNodeReader(doc); 
    DataSet ds = new DataSet(); 
    ds.ReadXml(xmlReader); 
    t = ds.Tables[0]; 
    return t; 
} 

並在最後一段我試圖將它綁定到我的下拉框(cmbSections)

DataTable t = sec.getSections(); 
cmbSections.DataSource = t; 
cmbSections.DisplayMember = "name"; 
cmbSections.ValueMember = "id"; 

但我發現了以下錯誤

Cannot bind to the new display member. 
Parameter name: newDisplayMember 

缺少什麼我在這裏,請大家幫幫忙,我是新來的C#世界

+0

如果你在getSections的返回行放置一個斷點,你在DataSet中看到了什麼? – sq33G 2011-12-18 19:06:34

+0

你有一個源XML模式? – curtisk 2011-12-18 19:16:44

+0

嗨Sq33G,我覺得我得到的一些值,但不知道如何調試,但是當我使用「t.GetType();」我越來越{} System.Data.DataTable作爲輸出,有沒有什麼特別的部分,我應該看看,謝謝你的答案 – sameera207 2011-12-18 19:19:47

回答

0

我把它用下面的代碼的工作,但我「M不會退出知道這是做

(此分析上面的相同的XML)

public DataTable getSections() { 
     String url = "http://<site_url>/sections.xml/sections.xml"; 
     DataTable t = new DataTable(); 
     t.Columns.Add("id", typeof(String)); 
     t.Columns.Add("name", typeof(String)); 

     HttpHandler handle = new HttpHandler(); 
     StreamReader sr = handle.executeGET(url); 
     String xml = ""; 
     List<String> id = new List<string>(); 
     List<String> name = new List<string>(); 

     while (sr.Peek() >= 0) 
     { 
      xml += sr.ReadLine(); 
     } 
     XmlDataDocument doc = new XmlDataDocument(); 
     doc.LoadXml(xml); 
     XmlReader xmlReader = new XmlNodeReader(doc); 
     while (xmlReader.Read()){ 
      if (xmlReader.IsStartElement()) { 
       String b = xmlReader.Name; 
       switch (xmlReader.Name) { 
        case "sections": 
         break; 
        case "section": 
         break; 
        case "id": 
         if (xmlReader.Read()) 
         { 
          id.Add(xmlReader.Value.Trim()); 
         } 
         break; 
        case "name": 
         if (xmlReader.Read()) 
         { 
          name.Add(xmlReader.Value.Trim()); 

         } 
         break; 

       } 
      } 
     } 

     int counter = 0; 

     foreach (String i in id) { 
      DataRow r = t.NewRow(); 
      r["id"] = i; 
      r["name"] = name[counter]; 
      t.Rows.Add(r);  
      counter += 1; 
     } 
     return t; 
    } 

感謝正確的方法S爲註釋:d 您的寶貴意見,隨時歡迎

1

使用擴展方法來支持的XElement轉換爲數據表。您可以將此方法添加到您的任何實用程序類。確保該課程是靜態的。

​​

如何使用

//Add logic to store xml data in file or string & read accordingly here. 
string file = Server.MapPath("~/Data.xml"); 
XDocument document = XDocument.Load(file); 
var query = from b in document.Elements("sections").Elements("section") 
        select b; 

DataTable table = query.ToDataTable(); 
1

簡單的方式XML轉換爲數據集:

 StringReader strr = new StringReader(strXML); 
     XmlTextReader xtr = new XmlTextReader(strr); 
     YourTypeDataSet dstest = new YourTypeDataSet(); 
     dstest.ReadXml(xtr); 

     if (dstest.Tables.Count > 0) ... 

正確的轉換,您更換類型的數據集代替: 數據集dstest = new DataSet();

;)

+0

還包裝你的讀者與「使用」塊或呼籲Dispose() – JoeSharp 2015-12-04 21:50:50

+0

謝謝,你是對的。 – Zolfaghari 2015-12-06 08:03:03