繁体   English   中英

如何使用C#将XML Web响应绑定到Windows窗体中的dataGridView中?

[英]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中绑定名称,地址和编号。 根据以上答复,将是:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM