2015-05-31 26 views
0

我有一個返回XML的Web服務。使用VB構建XML表Datagridview

下面是返回的代碼示例。

<?xml version="1.0" encoding="UTF-8"?> 
-<response uri="/crm/private/xml/Accounts/getRecords"> 
    -<result> 
     -<Accounts> 
      -<row no="1"> 
       <FL val="ACCOUNTID">1202xxx000000121001</FL> 
       <FL val="SMOWNERID">1202xxx000000071001</FL> 
      -<FL val="Account Owner"> 
       <![CDATA[Fred Smith]]> 
      </FL> 
      -<FL val="Account Name"> 
       <![CDATA[The Oaks Dental Practice]]> 
      </FL> 
      -<FL val="Phone"> 
       <![CDATA[01202 123123]]> 
      </FL> 
       -<FL val="Account Number"> 
      <![CDATA[0]]> 
      </FL> 
      -<FL val="Account Type"> 
       <![CDATA[Prospect]]> 
      </FL> 
      -<FL val="Employees"> 
       <![CDATA[0]]> 

我想用vb.net

麻煩的是它只返回基於頂級層次結構值,該數據拉入一個DataGridView,所以我得到一個表的列標題「 uri「和值」/ crm/private/xml/Accounts/getRecords「

如果我使用更簡單的XML結構,例如http://www.w3schools.com/xml/simple.xml它工作正常。

這裏是我的vb.net代碼:

Imports System.Data 
Imports System.Net 

Public Class Form1 

    Public Shared Sub DataSetSample1() 

     Dim request As HttpWebRequest 
     Dim response As HttpWebResponse = Nothing 
     Dim dsWeather As DataSet 

     Try 
      ' Create the web request 
      request = DirectCast(WebRequest.Create(_ 
        "https://crm.zoho.com/crm/private/xml/Accounts/getRecords?authtoken=????????3bb1c27c3116dc6b0275ea91&scope=crmapi"), HttpWebRequest) 

      ' Get response 
      response = DirectCast(request.GetResponse(), HttpWebResponse) 

      ' Load data into a dataset 
      dsWeather = New DataSet() 
      dsWeather.ReadXml(response.GetResponseStream()) 

      ' Print dataset information 
      PrintDataSet(dsWeather) 
     Finally 
      If Not response Is Nothing Then response.Close() 
     End Try 

     Form1.DataGridView2.DataSource = dsWeather.Tables(0) 

    End Sub 

    Public Shared Sub PrintDataSet(ByVal ds As DataSet) 

     ' Print out all tables and their columns 
     For Each table As DataTable In ds.Tables 
      Console.WriteLine("TABLE '{0}'", table.TableName) 
      Console.WriteLine("Total # of rows: {0}", table.Rows.Count) 
      Console.WriteLine("---------------------------------------------------------------") 

      For Each column As DataColumn In table.Columns 
       Console.WriteLine("- {0} ({1})", column.ColumnName, column.DataType.ToString()) 
      Next ' For Each column 

      Console.WriteLine(System.Environment.NewLine) 
     Next ' For Each table ' Print out table relations 
     For Each relation As DataRelation In ds.Relations 
      Console.WriteLine("RELATION: {0}", relation.RelationName) 
      Console.WriteLine("---------------------------------------------------------------") 
      Console.WriteLine("Parent: {0}", relation.ParentTable.TableName) 
      Console.WriteLine("Child: {0}", relation.ChildTable.TableName) 
      Console.WriteLine(System.Environment.NewLine) 
     Next ' For Each relation 

    End Sub 

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 
     DataSetSample1() 

    End Sub 
End Class 

我正在尋找如何拉回到正確的價值觀建表一些幫助。

感謝,

回答

0

試試這個

Imports System.IO 
Imports System.Xml 
Imports System.Xml.Linq 
Public Class Form1 

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 
     Dim input As String = _ 
      "<?xml version=""1.0"" encoding=""UTF-8""?>" + _ 
      "<response uri=""/crm/private/xml/Accounts/getRecords"">" + _ 
       "<result>" + _ 
        "<Accounts>" + _ 
         "<row no=""1"">" + _ 
          "<FL val=""ACCOUNTID"">1202xxx000000121001</FL>" + _ 
          "<FL val=""SMOWNERID"">1202xxx000000071001</FL>" + _ 
          "<FL val=""Account Owner"">" + _ 
           "<![CDATA[Fred Smith]]>" + _ 
          "</FL>" + _ 
          "<FL val=""Account Name"">" + _ 
           "<![CDATA[The Oaks Dental Practice]]>" + _ 
          "</FL>" + _ 
          "<FL val=""Phone"">" + _ 
           "<![CDATA[01202 123123]]>" + _ 
          "</FL>" + _ 
          "<FL val=""Account Number"">" + _ 
           "<![CDATA[0]]>" + _ 
          "</FL>" + _ 
          "<FL val=""Account Type"">" + _ 
           "<![CDATA[Prospect]]>" + _ 
          "</FL>" + _ 
          "<FL val=""Employees"">" + _ 
           "<![CDATA[0]]>" + _ 
          "</FL>" + _ 
         "</row>" + _ 
        "</Accounts>" + _ 
       "</result>" + _ 
      "</response>" 
     Dim doc As XDocument = XDocument.Parse(input) 
     Dim rows As List(Of XElement) = doc.Descendants("row").ToList() 

     Dim rowCount = 1 
     Dim dt As New DataTable 
     For Each row In rows 
      If rowCount = 1 Then 
       For Each col As XElement In row.Elements("FL") 
        Dim colName As String = col.Attribute("val").Value 
        dt.Columns.Add(colName, GetType(String)) 
       Next col 
      End If 
      rowCount += 1 
      Dim rowData As New List(Of String) 
      For Each col As XElement In row.Elements("FL") 
       rowData.Add(col.Value) 
      Next col 
      dt.Rows.Add(rowData.ToArray()) 
     Next row 

     DataGridView1.DataSource = dt 
    End Sub 
End Class 
​ 
+0

謝謝,但我原來的代碼通過Web服務拉着XML。你提供的代碼似乎有一個靜態輸入「Dim input As String =」。我錯過了什麼嗎?謝謝 – user3580480

+1

是的,是的,是的。將XML直接放入數據集最終會導致數據沿行而不是整列排列。您需要將XML放入XDocument中,然後解析文檔。一旦獲得了XML,就需要使用XDocument.Parse(XML字符串)將XML放入文檔中。 – jdweng