首页 > 解决方案 > 解析复杂的 XML 并提取值

问题描述

给定以下复杂的 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 到必要的节点,解析到 aJObject并以这种方式询问它,或者简单地将其保留为字符串并尝试对我需要的项目进行正则表达式。我什至已经获取了 XML 的内部文本并尝试提取迭代不同字符的文本。

我不愿意将其反序列化为对象,否则只会将问题转移到强类型形式。

所有这些方法都感觉非常笨重且不可维护。我正在寻找处理/解析这些数据的最佳方式的建议或方向。

我根本无法更改数据源。

标签: c#xmlserialization

解决方案


如果有人想知道 - 我能够通过获取所有成员节点并忽略我不需要的不相关节点来解决我的问题。下面的代码给了我一个包含我感兴趣的所有值的字典。它当然不优雅,但可以完成工作。

        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);
        }

如您所见,我跳过了前几个而忽略了最后一个。如果数据发生变化,这显然会中断。


推荐阅读