Разбор XML ответа от сервиса asp.net - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь интегрировать веб-сервис с моим проектом.Веб-служба возвращает XML-ответ:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
                   xmlns:ns1="http://www.tpg.ua/" 
                   xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                   xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
                   SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
    <SOAP-ENV:Body>
        <ns1:getCitiesResponse>
            <return xsi:type="xsd:string">
                [
                    {
                        "cityTitle": "Тирана",
                        "countryId": "7",
                        "cityId": "2493",
                        "IATA": "TIA"
                    },
                    {
                        "cityTitle": "Ла-Романа",
                        "countryId": "48",
                        "cityId": "1280",
                        "IATA": "LRM"
                    },
                    {
                        "cityTitle": "Херсон",
                        "countryId": "145",
                        "cityId": "2719",
                        "IATA": "KHE"
                    },
                    {
                        "cityTitle": "Шарм",
                        "countryId": "49",
                        "cityId": "2851",
                        "IATA": "SSH"
                    }
                ]
            </return>
        </ns1:getCitiesResponse>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Я пытаюсь разобрать этот ответ.Я хочу получить cityId и countryId

XmlDocument listXML = new XmlDocument();
listXML.LoadXml(response);

string baseNode = @"return/";

XmlNode item1 = listXML.SelectSingleNode(baseNode + "countryId"); 
XmlNode item2 = listXML.SelectSingleNode(baseNode + "cityId");

string s = item1.InnerText.ToString();
string s1 = item2.InnerText.ToString();

Но это null;что мне делать?

1 Ответ

2 голосов
/ 31 мая 2019

Элемент return вашего ответа SOAP содержит строку JSON, поэтому вы не можете использовать XmlDocument и запрос XPath для извлечения данных из этого.

Вам необходимо запросить данные JSON с помощью JSONdeserializer, например, я использовал JSON.NET в этом примере - вы можете добавить это в свой проект, установив пакет NuGet Newtonsoft.Json.

Так что здесь есть два шага - во-первыхизвлечь содержимое элемента return из ответа XML.Я использую XDocument вместо XmlDocument, как вы использовали, так как XDocument - это более современный API и лучше работает с такими современными языковыми функциями, как Linq.

Второй шаг - десериализация контента JSON,и извлеките содержимое в переменные.

var xDoc = XDocument.Parse(response);
var returnJson = xDoc.Descendants("return")
    .Single()
    .Value;

var cities = JArray.Parse(returnJson);
foreach (var city in cities)
{
    var cityId = city["cityId"].Value<string>();
    var countryId = city["countryId"].Value<string>();
}
...