Разбор сложного XML и извлечения значений - PullRequest
0 голосов
/ 15 мая 2019

Учитывая следующие сложные xml.

<?xml version="1.0" encoding="UTF-8"?>
<methodResponse>
   <params>
      <param>
         <value>
            <struct>
               <member>
                  <name>resps</name>
                  <value>
                     <array>
                        <data>
                           <value>
                              <struct>
                                 <member>
                                    <name>param0</name>
                                    <value>
                                       <struct>
                                          <member>
                                             <name>param1</name>
                                             <value>
                                                <int>12</int>
                                             </value>
                                          </member>
                                          <member>
                                             <name>param2</name>
                                             <value>
                                                <int>12</int>
                                             </value>
                                          </member>
                                       </struct>
                                    </value>
                                 </member>
                                 <member>
                                    <name>param12</name>
                                    <value>
                                       <int>3143</int>
                                    </value>
                                 </member>
                                 <member>
                                    <name>param3</name>
                                    <value>
                                       <int>207</int>
                                    </value>
                                 </member>
                                 <member>
                                    <name>param4</name>
                                    <value>
                                       <int>4056</int>
                                    </value>
                                 </member>
                                 <member>
                                    <name>param5</name>
                                    <value>
                                       <int>267</int>
                                    </value>
                                 </member>
                                 <member>
                                    <name>param6</name>
                                    <value>
                                       <double>1.290682</double>
                                    </value>
                                 </member>
                              </struct>
                           </value>
                        </data>
                     </array>
                  </value>
               </member>
               <member>
                  <name>errors</name>
                  <value>
                     <array>
                        <data />
                     </array>
                  </value>
               </member>
            </struct>
         </value>
      </param>
   </params>
</methodResponse>

Я хочу проанализировать это и получить ключ / значения, которые имеют решающее значение для меня - это param0 и param1 и т. Д. И т. П.

Я пробовал несколько подходов,Начиная с использования xpath для перехода к нужным узлам, парсинга до JObject и опрашивая его таким образом, или просто сохраняя его в виде строки, и пытаясь RegEx получить нужные мне элементы.Я даже зашел так далеко, что получил внутренний текст XML и попытался извлечь текст, перебирая различные символы.

Я не хочу десериализовать это в объект, а это просто переместит проблемув строго типизированную форму.

Все эти методы кажутся очень неуклюжими и не поддерживаемыми.Я ищу советы или указания для наилучшего способа обработки / анализа этих данных.

Я не могу изменить источник данных вообще.

1 Ответ

0 голосов
/ 16 мая 2019

В случае, если кому-то интересно - я смог решить мою проблему, получив все узлы-члены и проигнорировав ненужные, которые мне не нужны.Приведенный ниже код дает мне словарь всех значений, которые меня интересуют.Это, конечно, не элегантно, но выполняет свою работу.

        XmlDocument doc = new XmlDocument();
        doc.LoadXml(response);
        var memberTags = doc.GetElementsByTagName("member");
        for (int i = 2; i < memberTags.Count - 1; i++)
        {
            responseDictionary.Add(memberTags[i].FirstChild.InnerText, memberTags[i].LastChild.InnerText);
        }

Как видите, я пропускаю первые несколько и игнорирую последнее.Если данные когда-либо изменятся, это, очевидно, сломается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...