使用VB Datagridview构建XML表

时间:2015-05-31 13:02:47

标签: xml vb.net datagridview

我有一个返回XML的Web服务。

以下是返回代码的示例。

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

我正在寻找有关如何撤回正确值以构建表格的一些帮助。

谢谢,

1 个答案:

答案 0 :(得分: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
​