我有一个返回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
我正在寻找有关如何撤回正确值以构建表格的一些帮助。
谢谢,
答案 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