Как я могу связать веб-ответ XML в dataGridView в Windows Forms, используя C #? - PullRequest
0 голосов
/ 15 мая 2019

Я работаю в плагине в Windows Forms в C #. Я в основном отправляю запрос на мыло и получаю ответ в xml. Я просто возвращаю ответ в окне сообщения прямо сейчас, но я пытаюсь связать ответ в виде таблицы данных. Как я могу это сделать?

Вот как выглядит мой 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 в мою сетку данных:

 DataSet ds = new DataSet();
 XmlTextReader reader = new XmlTextReader(new StringReader(xml));
 ds.ReadXml(reader);
 dataGridView1.DataSource = ds;

Любая помощь будет принята с благодарностью!

1 Ответ

1 голос
/ 15 мая 2019

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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...