#xml #powershell #soap #ssis
#xml #powershell #soap #ssis
Вопрос:
После долгих часов изучения проблемы я столкнулся с чем-то вроде стены. По сути, я пытаюсь выполнить вызов SOAP для открытой веб-службы (для которой у меня есть WSDL). Я могу запустить свой сценарий PowerShell для выполнения вызова и возвращает результат XML. У меня возникли проблемы с подключением к SSIS и передачей этого XML для анализа. Я прочитал статьи, объясняющие выполнение этого через веб-сервис (который я получаю с сообщением об ошибке при webmethod) и задачу сценария / процесса.
В настоящее время работаю с задачей процесса, которая вызывает сценарий PowerShell для выполнения вызова SOAP и получения XML-ответа, который я могу проанализировать и вставить в таблицу SQL
Задача процесса / веб-сервиса / сценария VB-код (не владеющий) PowerShell для сохранения ответа в файл и вставки в SQL
#setting TLS to 1.2 as webservice rejects 1.0
[System.Net.ServicePointManager]::SecurityProtocol =
[System.Net.SecurityProtocolType]::Tls12
#setting URL Endpoint
$uri = "WebserviceURL"
#structuring the request with the infile being the soap action with headers
$post = Invoke-WebRequest -Uri $uri -InFile c:SOAPREQUESTACTION -ContentType "text/xml" -method post`
Ожидаемые результаты — служба SSIS может анализировать XML-ответ в переменные и вставлять в таблицу SQL, после чего она обновит элементы по мере изменения атрибутов при следующем вызове SOAP
пример ответа
<?xml version='1.0' encoding='UTF-8'?><env:Envelope
xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><env:Body>
<wd:Report_Data xmlns:wd="WEBSERVICEURN">
<wd:Report_Entry>
<wd:Preferred_Name_-_First_Name>Joe</wd:Preferred_Name_-_First_Name>
<wd:Preferred_Name_-_Last_Name>Professional</wd:Preferred_Name_-
_Last_Name>
<wd:businessTitle>Joe Professional Title</wd:businessTitle>
<wd:Department wd:Descriptor="Joes Professional Department">
</wd:Report_Entry></wd:Report_Data></env:Body></env:Envelope>
Комментарии:
1. Вы пробовали просто использовать
New-WebServiceProxy
2. у меня есть, powershell sciprt работает, больше касается использования в SSIS. Я смог получить ответ на переменную, но не уверен, как вызвать и проанализировать переменную, однажды использованную в SSIS
3. Вставьте XML-ответ в свой вопрос. Я могу рассказать вам, как обрабатывать эту строку
4. @KeithL в OP добавлен ответ XML, проверьте это
Ответ №1:
Прежде всего, мне пришлось очистить ваш XML, чтобы:
<?xml version='1.0' encoding='UTF-8'?><env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"><env:Body>
<wd:Report_Data xmlns:wd="WEBSERVICEURN">
<wd:Report_Entry>
<wd:Preferred_Name_-_First_Name>Joe</wd:Preferred_Name_-_First_Name>
<wd:Preferred_Name_-_Last_Name>Professional</wd:Preferred_Name_-_Last_Name>
<wd:businessTitle>Joe Professional Title</wd:businessTitle>
<wd:Department wd:Descriptor="Joes Professional Department"/>
</wd:Report_Entry></wd:Report_Data></env:Body></env:Envelope>
Я предполагаю, что он загружен в файл. Я вызвал этот файл xml.txt
- Добавьте поток данных
- В потоке данных добавьте компонент сценария (источник)
- Добавьте свои столбцы в выходные данные
- Редактировать сценарий
- Добавить в пространства имен
- использование System.Xml.Serialization;
- использование системы.Коллекции.Общий;
-
добавьте следующий код для CreateOutputRows()
var xml = System.IO.File.ReadAllBytes(@"D:tempxml.txt"); System.IO.Stream s_xml = new System.IO.MemoryStream(xml); XmlSerializer serializer = new XmlSerializer(typeof(Envelope)); var results = (Envelope)serializer.Deserialize(s_xml); foreach (var entry in results.Body.Report_Data.Report_Entry) { Output0Buffer.AddRow(); Output0Buffer.fname = entry.Preferred_Name__First_Name; Output0Buffer.lname = entry.Preferred_Name__Last_Name; Output0Buffer.title = entry.BusinessTitle; Output0Buffer.dept = entry.Department.Descriptor; } s_xml.Close();
-
Используйте веб-сайт, подобный xml2csharp.com чтобы преобразовать xml в классы и вставить классы ниже:
[XmlRoot(ElementName = "Department", Namespace = "WEBSERVICEURN")] public class Department { [XmlAttribute(AttributeName = "Descriptor", Namespace = "WEBSERVICEURN")] public string Descriptor { get; set; } } [XmlRoot(ElementName = "Report_Entry", Namespace = "WEBSERVICEURN")] public class Report_Entry { [XmlElement(ElementName = "Preferred_Name_-_First_Name", Namespace = "WEBSERVICEURN")] public string Preferred_Name__First_Name { get; set; } [XmlElement(ElementName = "Preferred_Name_-_Last_Name", Namespace = "WEBSERVICEURN")] public string Preferred_Name__Last_Name { get; set; } [XmlElement(ElementName = "businessTitle", Namespace = "WEBSERVICEURN")] public string BusinessTitle { get; set; } [XmlElement(ElementName = "Department", Namespace = "WEBSERVICEURN")] public Department Department { get; set; } } [XmlRoot(ElementName = "Report_Data", Namespace = "WEBSERVICEURN")] public class Report_Data { [XmlElement(ElementName = "Report_Entry", Namespace = "WEBSERVICEURN")] public List<Report_Entry> Report_Entry { get; set; } [XmlAttribute(AttributeName = "wd", Namespace = "http://www.w3.org/2000/xmlns/")] public string Wd { get; set; } } [XmlRoot(ElementName = "Body", Namespace = "http://schemas.xmlsoap.org/soap/envelope/")] public class Body { [XmlElement(ElementName = "Report_Data", Namespace = "WEBSERVICEURN")] public Report_Data Report_Data { get; set; } } [XmlRoot(ElementName = "Envelope", Namespace = "http://schemas.xmlsoap.org/soap/envelope/")] public class Envelope { [XmlElement(ElementName = "Body", Namespace = "http://schemas.xmlsoap.org/soap/envelope/")] public Body Body { get; set; } [XmlAttribute(AttributeName = "env", Namespace = "http://www.w3.org/2000/xmlns/")] public string Env { get; set; } }
-
Сохраните и завершите
- Теперь у вас есть свои столбцы в потоке данных, с которыми вы можете делать все, что захотите.