Извлечение внутреннего элемента из ответа SOAP в C#
Мне требуется конкретный элемент из ответа на мой запрос SOAP POST. Мой фактический запрос выполняется с помощью HTTP-клиента, и это прекрасно работает. Я пытался вытащить внутренний элемент из этого ответа, чтобы использовать его в своем приложении, но так и не нашел способа. Это мой первый раз, когда я использую запросы SOAP, поэтому любая помощь будет оценена по достоинству.
Ниже приведен мой ответ от почтальона: мне нужно получить значение "CustomerName"
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body> <Query_With_StringResponse xmlns="http://www.syspro.com/ns/query/"> <Query_With_StringResult><?xml version="1.0" encoding="Windows-1252"?> <ARListOfCustomers Language='05' Language2='EN' CssStyle='' DecFormat='1' DateFormat='01' Role='01' Version='7.0.005' OperatorPrimaryRole=' ' > <QueryOptions> <ReportSequence>CU</ReportSequence> <PriceCode/> <PriceProductmatrix>N</PriceProductmatrix> <ExtraFields>N</ExtraFields> <InterestExemptionStatusSelection>A</InterestExemptionStatusSelection> <TaxExemptionSelection>A</TaxExemptionSelection> <CustomerSelectionFilterType>A</CustomerSelectionFilterType> <CustomerSelectionFilterValue/> <CustomerClassSelectionFilterType>A</CustomerClassSelectionFilterType> <CustomerClassSelectionFilterValue/> <GeographicAreaSelectionFilterType>A</GeographicAreaSelectionFilterType> <GeographicAreaSelectionFilterValue/> <BranchSelectionFilterType>A</BranchSelectionFilterType> <BranchSelectionFilterValue/> <SalespersonSelectionFilterType>A</SalespersonSelectionFilterType> <SalespersonSelectionFilterValue/> <LineDiscountCodeSelectionFilterType>A</LineDiscountCodeSelectionFilterType> <LineDiscountCodeSelectionFilterValue/> <TermsSelectionFilterType>A</TermsSelectionFilterType> <TermsSelectionFilterValue/> <ProductCategorySelectionFilterType>A</ProductCategorySelectionFilterType> <ProductCategorySelectionFilterValue/> <InvoiceDiscountCodeSelectionFilterType>A</InvoiceDiscountCodeSelectionFilterType> <InvoiceDiscountCodeSelectionFilterValue/> <CurrencySelectionFilterType>A</CurrencySelectionFilterType> <CurrencySelectionFilterValue/> <CreditLimitSelectionFilterType>A</CreditLimitSelectionFilterType> <CreditLimitSelectionFilterValue/> </QueryOptions> <Customer> <CustomerListHeader> <Customer>TSAR</Customer> <CustomerName>TSAR BUSINESS SOLUTION</CustomerName> <CustomerShortName>TSAR BUSINESS SOLUTI</CustomerShortName> <Branch>TSAR</Branch> <BranchDescription>HEAD OFFICE TSAR</BranchDescription> <Geography>031</Geography> <GeographyDescription>DURBAN</GeographyDescription> <Class/> <ClassDescription>** Not on file **</ClassDescription> <BalanceType>Op-item</BalanceType> <Sales>IVAN</Sales> <CreditLimit> 0</CreditLimit> <Currency>R</Currency> <CurrencyDescription>Rand</CurrencyDescription> <Telephone/> <InvoiceTermsCode>CO</InvoiceTermsCode> <TermsCodeDescription>CASH ON DELIVERY</TermsCodeDescription> </CustomerListHeader> <CustomerListDetails> <Contact/> <TaxNo>Tax No:</TaxNo> <SpecialInstructions/> <SoldToAddress1/> <SoldToAddress2/> <SoldToAddress3/> <SoldToAddress3Loc/> <SoldToAddress4/> <SoldToAddress5/> <SoldToAddress6/> <SoldToGpsLat> 0.000000</SoldToGpsLat> <SoldToGpsLong> 0.000000</SoldToGpsLong> <ShipToAddress1>STRAUSS DALY</ShipToAddress1> <ShipToAddress2>41 RICHFONT CRICLE</ShipToAddress2> <ShipToAddress3>DURBAN</ShipToAddress3> <ShipToAddress3Loc/> <ShipToAddress4>KZB</ShipToAddress4> <ShipToAddress5>SOUTH AFRICA</ShipToAddress5> <ShipToAddress6>4000</ShipToAddress6> <ShipToGpsLat> 0.000000</ShipToGpsLat> <ShipToGpsLong> 0.000000</ShipToGpsLong> <GSTNumber/> <LineDiscCode/> <InvDiscCode/> <DefaultPriceCode/> <CompanyTaxNumber/> <ExemptFinChg>No finance charges</ExemptFinChg> </CustomerListDetails> </Customer> <ReportSummary> <NoOfCustomersListed> 1</NoOfCustomersListed> </ReportSummary> </ARListOfCustomers> </Query_With_StringResult> </Query_With_StringResponse> </soap:Body> </soap:Envelope>
Что я уже пробовал:
Мой код на языке Си#
public async Task<string> CreateSoapEnvelop() { string soapString = @"<?xml version=""1.0"" encoding=""utf-8""?> <soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""> <soap:Body> <Query_With_String xmlns=""http://www.syspro.com/ns/query/""> <UserId>" + Settings.GUID + @"</UserId> <BusinessObject></BusinessObject> <XMLIn></XMLIn> </Query_With_String> </soap:Body> </soap:Envelope>"; HttpResponseMessage response = await PostXmlRequest("http://sysprowebservices/query.asmx", soapString); var soapResponse = await response.Content.ReadAsStringAsync(); XmlDocument doc = new XmlDocument(); doc.LoadXml(soapResponse); XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable); nsmgr.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/"); nsmgr.AddNamespace("ab", "http://www.syspro.com/ns/query/"); nsmgr.AddNamespace("bg", " https://bixg.choicepoint.com/webservices/3.0"); nsmgr.AddNamespace("xsd", "http://www.w3.org/2001/XMLSchema"); nsmgr.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); XmlNode xmlnode = doc.DocumentElement.SelectSingleNode("/soap:Envelope/soap:Body/ab:Query_With_StringResponse/ab:Query_With_StringResult", nsmgr); //String contractId = node2.SelectSingleNode("ContractID").InnerXml; string customer = xmlnode.SelectSingleNode("Customer").InnerXml; return ""; } public static async Task<HttpResponseMessage> PostXmlRequest(string baseUrl, string xmlString) { using (var httpClient = new HttpClient()) { var httpContent = new StringContent(xmlString, Encoding.UTF8, "text/xml"); httpContent.Headers.Add("SOAPAction", "http://www.syspro.com/ns/query/Query_With_String"); return await httpClient.PostAsync(baseUrl, httpContent); } }
Kornfeld Eliyahu Peter
Забудь про мыло. Это чистая проблема XML - узнайте о XPath...
Janine_A
Не могли бы вы прислать мне ссылку, которая относится к тому, что мне нужно сделать здесь? Спасибо
Kornfeld Eliyahu Peter
https://www.w3schools.com/xml/xpath_intro.asp
Janine_A
Спасибо. Пожалуйста, проверьте мой обновленный код при использовании XPath: теперь он отлично возвращает все мои поля. Не могли бы вы посоветовать, как получить значение "CustomerName" - вы увидите мою попытку получить его, но оно возвращает null вместо значения