Парсинг XML ответа со спецсимволами < средствами SQL
Есть ответ сервера со спецсимволами. Как парсить такого рода ответы?
<Text xsi:type="xsd:string" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><?xml version="1.0" encoding="windows-1251"?>
<getCarNSIReply>
<car>
<carNumber value="29129426"/>
<carNSIDate value="20.05.2020 14:30:05"/>
<carResponse value="1"/>
<carTypeID value="40"/>
<carTypeCode value="20"/>
<carTypeName value="крытые"/>
<carAxles value="4"/>
<carOwnerCountryCode value="643"/>
<carOwnerCountryName value="РОССИЯ"/>
<carOwnerTypeID value="1"/>
<carOwnerTypeName value="Собственный"/>
<carOwnerId value="352666"/>
<carOwnerOKPO value="76396169"/>
<carOwnerName value="Публичное акционерное общество &quot;ТРАНСФИН-М&quot;"/>
<carTonnage value="67"/>
<carWeightDep value="268"/>
<carTankType value="0"/>
<carVolume value="161"/>
<carArendatorID value="648579"/>
<carArendatorOKPO value="06087120"/>
<carArendatorName value="Общество с ограниченной ответственностью &quot;ФТ Логистик&quot;"/>
<carEndArendaDate value="30.06.2029 00:00:00"/>
<carYear value="2019"/>
<carTypeRepair value="0"/>
<carNextRepair value="04.06.2022 00:00:00"/>
<carBanned value="0"/>
<carSign value="3"/>
<carLength value="18.86"/>
<carRace value="0"/>
<carNorma value="0"/>
<carDateSob value="12.08.2019 00:00:00"/>
<carModel value="11-2135-01"/>
<carConsPark value="0"/>
<carTrustedOperatorID value="635766"/>
<carTrustedOperatorOKPO value="33977721"/>
<carTrustedOperator value="ООО &quot;Кучуктерминал&quot;"/>
<carKODS value="10613"/>
<carKODARNUM value="13137"/>
<carCN_SOBSTV_ID value="178"/>
<carTYPEV value="211"/>
<carMODEL_CODE value="2624"/>
<carPR_K value="1"/>
<carPR_K_NAME value="Наличие тех.паспорта"/>
</car>
<car>
<carNumber value="29131398"/>
<carNSIDate value="15.06.2020 03:33:37"/>
<carResponse value="1"/>
<carTypeID value="40"/>
<carTypeCode value="20"/>
<carTypeName value="крытые"/>
<carAxles value="4"/>
<carOwnerCountryCode value="643"/>
<carOwnerCountryName value="РОССИЯ"/>
<carOwnerTypeID value="1"/>
<carOwnerTypeName value="Собственный"/>
<carOwnerId value="550308"/>
<carOwnerOKPO value="78961835"/>
<carOwnerName value="Общество с ограниченной ответственностью &quot;РЕГИОН Групп Лизинг&quot;"/>
<carTonnage value="66.7"/>
<carWeightDep value="271"/>
<carTankType value="0"/>
<carVolume value="165"/>
<carArendatorID value="646153"/>
<carArendatorOKPO value="03581196"/>
<carArendatorName value="Общество с ограниченной ответственностью &quot;Успешная Команда &quot;Русская Сталь&quot;"/>
<carEndArendaDate value="10.02.2026 00:00:00"/>
<carYear value="2013"/>
<carTypeRepair value="1"/>
<carLastRepair value="13.02.2020 00:00:00"/>
<carNextRepair value="13.02.2022 00:00:00"/>
<carBanned value="0"/>
<carSign value="3"/>
<carLength value="18.84"/>
<carRace value="0"/>
<carNorma value="0"/>
<carDateSob value="09.04.2019 00:00:00"/>
<carModel value="11-1807-01"/>
<carConsPark value="0"/>
<carTrustedOperatorID value="662733"/>
<carTrustedOperatorOKPO value="06304155"/>
<carTrustedOperator value="ООО &quot;УК &quot;РС-транс&quot;"/>
<carKODS value="171436"/>
<carKODARNUM value="173181"/>
<carCN_SOBSTV_ID value="178"/>
<carTYPEV value="211"/>
<carMODEL_CODE value="1231"/>
<carPR_K value="1"/>
<carPR_K_NAME value="Наличие тех.паспорта"/>
</car>
</getCarNSIReply>
</Text>
Ответы (2 шт):
Автор решения: aepot
→ Ссылка
Это не валидный XML, у него бардак с неймспейсами. И вообще, это выглядит как XML внутри другого XML. Я покажу, как распаковать.
Класс данных
[XmlRoot("Text")]
public class PackedResponse
{
[XmlText]
public string Text { get; set; }
}
Распаковка
string text; // пусть строковая переменная text содержит ваш ответ от сервера
// ...
PackedResponse response;
using (StringReader sr = new StringReader(text))
{
using (XmlTextReader reader = new XmlTextReader(sr))
{
reader.Namespaces = false;
XmlSerializer serializer = new XmlSerializer(typeof(PackedResponse));
response = (PackedResponse)serializer.Deserialize(reader);
}
}
Console.WriteLine(response.Text);
Вывод в консоль.
<?xml version="1.0" encoding="windows-1251"?>
<getCarNSIReply>
<car>
<carNumber value="29129426"/>
<carNSIDate value="20.05.2020 14:30:05"/>
<carResponse value="1"/>
<carTypeID value="40"/>
<carTypeCode value="20"/>
<carTypeName value="крытые"/>
<carAxles value="4"/>
<carOwnerCountryCode value="643"/>
<carOwnerCountryName value="РОССИЯ"/>
<carOwnerTypeID value="1"/>
<carOwnerTypeName value="Собственный"/>
<carOwnerId value="352666"/>
<carOwnerOKPO value="76396169"/>
<carOwnerName value="Публичное акционерное общество "ТРАНСФИН-М""/>
<carTonnage value="67"/>
<carWeightDep value="268"/>
<carTankType value="0"/>
<carVolume value="161"/>
<carArendatorID value="648579"/>
<carArendatorOKPO value="06087120"/>
<carArendatorName value="Общество с ограниченной ответственностью "ФТ Логистик""/>
<carEndArendaDate value="30.06.2029 00:00:00"/>
<carYear value="2019"/>
<carTypeRepair value="0"/>
<carNextRepair value="04.06.2022 00:00:00"/>
<carBanned value="0"/>
<carSign value="3"/>
<carLength value="18.86"/>
<carRace value="0"/>
<carNorma value="0"/>
<carDateSob value="12.08.2019 00:00:00"/>
<carModel value="11-2135-01"/>
<carConsPark value="0"/>
<carTrustedOperatorID value="635766"/>
<carTrustedOperatorOKPO value="33977721"/>
<carTrustedOperator value="ООО "Кучуктерминал""/>
<carKODS value="10613"/>
<carKODARNUM value="13137"/>
<carCN_SOBSTV_ID value="178"/>
<carTYPEV value="211"/>
<carMODEL_CODE value="2624"/>
<carPR_K value="1"/>
<carPR_K_NAME value="Наличие тех.паспорта"/>
</car>
<car>
<carNumber value="29131398"/>
<carNSIDate value="15.06.2020 03:33:37"/>
<carResponse value="1"/>
<carTypeID value="40"/>
<carTypeCode value="20"/>
<carTypeName value="крытые"/>
<carAxles value="4"/>
<carOwnerCountryCode value="643"/>
<carOwnerCountryName value="РОССИЯ"/>
<carOwnerTypeID value="1"/>
<carOwnerTypeName value="Собственный"/>
<carOwnerId value="550308"/>
<carOwnerOKPO value="78961835"/>
<carOwnerName value="Общество с ограниченной ответственностью "РЕГИОН Групп Лизинг""/>
<carTonnage value="66.7"/>
<carWeightDep value="271"/>
<carTankType value="0"/>
<carVolume value="165"/>
<carArendatorID value="646153"/>
<carArendatorOKPO value="03581196"/>
<carArendatorName value="Общество с ограниченной ответственностью "Успешная Команда "Русская Сталь""/>
<carEndArendaDate value="10.02.2026 00:00:00"/>
<carYear value="2013"/>
<carTypeRepair value="1"/>
<carLastRepair value="13.02.2020 00:00:00"/>
<carNextRepair value="13.02.2022 00:00:00"/>
<carBanned value="0"/>
<carSign value="3"/>
<carLength value="18.84"/>
<carRace value="0"/>
<carNorma value="0"/>
<carDateSob value="09.04.2019 00:00:00"/>
<carModel value="11-1807-01"/>
<carConsPark value="0"/>
<carTrustedOperatorID value="662733"/>
<carTrustedOperatorOKPO value="06304155"/>
<carTrustedOperator value="ООО "УК "РС-транс""/>
<carKODS value="171436"/>
<carKODARNUM value="173181"/>
<carCN_SOBSTV_ID value="178"/>
<carTYPEV value="211"/>
<carMODEL_CODE value="1231"/>
<carPR_K value="1"/>
<carPR_K_NAME value="Наличие тех.паспорта"/>
</car>
</getCarNSIReply>
Теперь это можно десереализовать как нормальный XML.
Автор решения: Alexander Petrov
→ Ссылка
Предложу ещё более простой способ.
string text = "ответ сервера";
var xml = XElement.Parse(text);
var elem = XElement.Parse(xml.Value.Trim());
Console.WriteLine(elem);
Первым вызовом XElement.Parse получаем результат, в котором < и > заменены на < и >.
Вторым вызовом XElement.Parse парсим этот результат. Только нужно окружающие пробельные символы удалить.
Далее средствами linq to xml получаем значения:
var carNumber = elem.Element("car").Element("carNumber").Attribute("value").Value;
Console.WriteLine(carNumber); // 29129426