2015-05-31 3 views
0

У меня есть веб-служба, которая возвращает XML.Сборка XML-таблицы с использованием VB 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]]> 

Я пытаюсь вытащить эти данные в DataGridView с помощью vb.net

Беда в том, что только возвращает значения, основанные на иерархии верхнего уровня, так что я получаю таблицу с заголовком столбца " 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

Спасибо, но мой исходный код вытащил XML с помощью веб-службы. Код, который вы предоставили, по-видимому, имеет статический ввод «Dim input As String =». Я что-то упускаю? Спасибо – user3580480

+1

Да, да, да. Помещение XML непосредственно в набор данных заканчивается данными, идущими вниз по строкам, а не по столбцам. Вам нужно поместить XML в XDocument, затем проанализировать документ. После того, как вы получите XML, вам нужно поместить XML в документ, используя XDocument.Parse (XML-строку). – jdweng

Смежные вопросы