2011-12-18 3 views
1

간단한 웹 서비스 (REST)를 읽고 C# 데스크톱 응용 프로그램에서 드롭 다운 상자를 채우려고합니다. 나는, C#에서 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 문서를 변환하기 위해 노력하고있어 내 웹 서비스 반환 XML에 따라 .NET 2.0을

되어 사용하고

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; 
} 

마지막 세그먼트에서 내 드롭 다운 상자 (cmb 섹션)에 바인드하려고합니다.

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의 반환 줄에 중단 점을 배치하면 데이터 집합에서 무엇을 볼 수 있습니까? – sq33G

+0

소스 xml에 대한 스키마가 있습니까? – curtisk

+0

안녕하세요 Sq33G, 일부 값을 가져 오는 것 같아요,하지만 디버깅하는 방법을 몰라,하지만 내가 't.GetType();' {System.Data.DataTable} 출력으로있어, 내가 봐야 할 특별한 섹션이 있습니다, 대답을 주셔서 감사합니다 – sameera207

답변

0

에 새로 온 사람, 도움이,하지만 제발, 여기 실종입니다 이 그것을

(이것은 위의 동일한 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; 
    } 

감사를 할 수있는 올바른 방법인지 확실 종료하고 있지 않다 ' D언제나 환영할만한 가치가 있습니다.

1

XElement를 Datatable로 변환하는 확장 방법을 사용하십시오. 유틸리티 클래스에이 메서드를 추가 할 수 있습니다. 클래스가 정적인지 확인하십시오. DataSet에 XML을 변환하는

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

간단한 방법을 사용하는 방법

public static class XElementExtensions { public static DataTable ToDataTable(this XElement element) { DataSet ds = new DataSet(); string rawXml = element.ToString(); ds.ReadXml(new StringReader(rawXml)); return ds.Tables[0]; } public static DataTable ToDataTable(this IEnumerable<XElement> elements) { return ToDataTable(new XElement("Root", elements)); } } 

: 데이터 집합 dstest :

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

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

정확한 변환을 위해, 당신은 대신에 당신의 유형의 데이터 집합을 대체 = 새로운 DataSet();

)

+0

또한 블록을 사용하여 독자를 포장하거나 Dispose() – JoeSharp

+0

에게 전화하십시오. – Zolfaghari

관련 문제