[英]How can I bind a XML web response into a dataGridView in a Windows Forms using C#?
我正在使用C#中的Windows窗体中的插件进行工作。 我基本上是发送一个肥皂请求,并在xml中获得响应。 我现在只是在消息框中返回响应,但是我试图将响应绑定到datagrid视图中。 我怎样才能做到这一点?
这就是我的SOAP请求如下所示。
private void getEntitySummary(long entityID)
{
//Create client
myAPI.ResolvingBinding resol = new myAPI.ResolvingBinding();
//Create parameters
myAPI.EntityID[] entityIDArr = new myAPI.EntityID[1];
myAPI.EntityID entityIDitem = new myAPI.EntityID();
entityIDitem.entityID = entityID;
entityIDArr[0] = entityIDitem;
myAPI.DepthSpecifier depth = new myAPI.DepthSpecifier();
myAPI.CustomInformation customInfo = new myAPI.CustomInformation();
//Make request
myAPI.EntitySummary[] entitySummaryRes = resol.getEntitySummaries(entityIDArr, depth, customInfo);
//Handle response
foreach (myAPI.EntitySummary e in entitySummaryRes)
{
string firstName = e.bestName?.givenName;
string surName = e.bestName?.surname;
string streetName = e.bestAddress?.street1;
string city = e.bestAddress?.city;
string state = e.bestAddress?.state;
string country = e.bestAddress?.country;
string address = (streetName + " " + city + " " + state + " " + country).Trim();
string email = e.bestEmail?.emailAddress;
string number = e.bestNumber?.numberValue;
MessageBox.Show(firstName + " " + surName + ", " + address +", " + number );
// need datagridView instead of a msg box here
}
}
该代码运行良好,并在后台以xml格式提供了响应。 它看起来像以下内容:
<?xml version="1.0" encoding="UTF-8"?> <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:errdetail="http://rr.eas.ibm.com/EntityResolver/ErrorDetail" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<getEntitySummariesResponse xmlns="http://services/">
<entitySummaries xmlns="">
<entityID>101010</entityID>
<nameCount>3</nameCount>
<numberCount>7</numberCount>
<addressCount>9</addressCount>
<emailCount>0</emailCount>
<attributeCount>6</attributeCount>
<accountCount>21</accountCount>
<roleAlertCount>447</roleAlertCount>
<relationshipCount>19</relationshipCount>
<eventAlertCount>0</eventAlertCount>
<bestName>
<identityHandle>
<internalID>222</internalID>
<externalID>333John</externalID>
<dataSourceCode>neutral</dataSourceCode>
<externalReference>333John</externalReference>
</identityHandle>
<timestamp>2016-06-28T12:24:21</timestamp>
<lastModifiedTimestamp>2010-05-28T12:24:21</lastModifiedTimestamp>
<nameID>444</nameID>
<nameTypeCode>M</nameTypeCode>
<givenName>John</givenName>
<surname>Doe</surname>
<culture>culture</culture>
</bestName>
<bestAddress>
<identityHandle>
<internalID>222</internalID>
<externalID>333John</externalID>
<dataSourceCode>neutral</dataSourceCode>
<externalReference>333John</externalReference>
</identityHandle>
<timestamp>2010-05-28T12:24:21</timestamp>
<lastModifiedTimestamp>2010-05-28T12:24:21</lastModifiedTimestamp>
<addressID>395116</addressID>
<addressTypeCode>H</addressTypeCode>
<street1>1111 East St</street1>
<city>Pikesville</city>
<state>AL</state>
<country>USA</country>
</bestAddress>
<bestNumber>
<identityHandle>
<internalID>222</internalID>
<externalID>333John</externalID>
<dataSourceCode>neutral</dataSourceCode>
<externalReference>333John</externalReference>
</identityHandle>
<timestamp>2010-05-28T12:24:21</timestamp>
<lastModifiedTimestamp>2010-05-28T12:24:21</lastModifiedTimestamp>
<numberID>6666</numberID>
<numberTypeID>2</numberTypeID>
<numberValue>123-45-6789</numberValue>
</bestNumber>
<bestAttribute xmlns:ns2="http://entity/results/" xsi:type="ns2:CharacteristicDetail">
<identityHandle>
<internalID>222</internalID>
<externalID>333John</externalID>
<dataSourceCode>neutral</dataSourceCode>
<externalReference>333John</externalReference>
</identityHandle>
<timestamp>2010-05-28T12:24:21</timestamp>
<lastModifiedTimestamp>2010-05-28T12:24:21</lastModifiedTimestamp>
<characteristicID>8888</characteristicID>
<characteristicValue>M</characteristicValue>
<characteristicTypeID>2</characteristicTypeID>
</bestAttribute>
</entitySummaries>
</getEntitySummariesResponse>
</soapenv:Body> </soapenv:Envelope>
简而言之,我需要在dataGridView中绑定名称,地址和编号。 根据以上答复,将是:
我尝试了以下方法,但是我不明白如何将xml响应放入我的datagrid中:
DataSet ds = new DataSet();
XmlTextReader reader = new XmlTextReader(new StringReader(xml));
ds.ReadXml(reader);
dataGridView1.DataSource = ds;
任何帮助将不胜感激!
ReadXml无法使用,因为xml上的嵌套级别数太深。 最终,您将获得大量数据表,并且数据碎片化,无法将数据放回可用格式。 我将致力于解决方案。 请花我几分钟。
我解析了一些代码以获得平坦的结果。 见下面的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;
using System.Data;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
string response = File.ReadAllText(FILENAME);
XDocument doc = XDocument.Parse(response);
XElement root = doc.Root;
XNamespace ns = root.GetDefaultNamespace();
DataTable dt = new DataTable();
dt.Columns.Add("entityID", typeof(string));
dt.Columns.Add("nameCount", typeof(int));
dt.Columns.Add("numberCount", typeof(int));
dt.Columns.Add("addressCount", typeof(int));
dt.Columns.Add("emailCount", typeof(int));
dt.Columns.Add("attributeCount", typeof(int));
dt.Columns.Add("accountCount", typeof(int));
dt.Columns.Add("roleAlertCount", typeof(int));
dt.Columns.Add("relationshipCount", typeof(int));
dt.Columns.Add("eventAlertCount", typeof(int));
dt.Columns.Add("bestName_internalID", typeof(int));
dt.Columns.Add("bestName_externalID", typeof(string));
dt.Columns.Add("bestName_dataSourceCode", typeof(string));
dt.Columns.Add("bestName_externalReference", typeof(string));
dt.Columns.Add("bestName_timestamp", typeof(DateTime));
dt.Columns.Add("bestName_lastModifiedTimestamp", typeof(DateTime));
dt.Columns.Add("bestName_nameID", typeof(int));
dt.Columns.Add("bestName_nameTypeCode", typeof(string));
dt.Columns.Add("bestName_givenName", typeof(string));
dt.Columns.Add("bestName_surname", typeof(string));
dt.Columns.Add("bestName_culture", typeof(string));
List<XElement> entitySummaries = root.Descendants(ns + "entitySummaries").ToList();
foreach (XElement entitySummary in entitySummaries)
{
DataRow newRow = dt.Rows.Add();
string entityID = (string)entitySummary.Element(ns + "entityID");
int nameCount = (int)entitySummary.Element(ns + "nameCount");
int numberCount = (int)entitySummary.Element(ns + "numberCount");
int addressCount = (int)entitySummary.Element(ns + "addressCount");
int emailCount = (int)entitySummary.Element(ns + "emailCount");
int attributeCount = (int)entitySummary.Element(ns + "attributeCount");
int accountCount = (int)entitySummary.Element(ns + "accountCount");
int roleAlertCount = (int)entitySummary.Element(ns + "roleAlertCount");
int relationshipCount = (int)entitySummary.Element(ns + "relationshipCount");
int eventAlertCount = (int)entitySummary.Element(ns + "eventAlertCount");
XElement bestName = entitySummary.Element(ns + "bestName");
int internalID = (int)bestName.Descendants(ns + "internalID").FirstOrDefault();
string externalID = (string)bestName.Descendants(ns + "externalID").FirstOrDefault();
string dataSourceCode = (string)bestName.Descendants(ns + "dataSourceCode").FirstOrDefault();
string externalReference = (string)bestName.Descendants(ns + "externalReference").FirstOrDefault();
DateTime timestamp = (DateTime)bestName.Element(ns + "timestamp");
DateTime lastModifiedTimestamp = (DateTime)bestName.Element(ns + "lastModifiedTimestamp");
int nameID = (int)bestName.Element(ns + "nameID");
string nameTypeCode = (string)bestName.Element(ns + "nameTypeCode");
string givenName = (string)bestName.Element(ns + "givenName");
string surname = (string)bestName.Element(ns + "surname");
string culture = (string)bestName.Element(ns + "culture");
newRow.ItemArray = new object[] {
entityID,
nameCount,
numberCount,
addressCount,
emailCount,
attributeCount,
accountCount,
roleAlertCount,
relationshipCount,
eventAlertCount,
internalID,
externalID,
dataSourceCode,
externalReference,
timestamp,
lastModifiedTimestamp,
nameID,
nameTypeCode,
givenName,
surname,
culture
};
}//end foreach
datagridview1.Datasource = dt;
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.