【问题标题】:Parsing Complex XML and Extract Values解析复杂的 XML 并提取值
【发布时间】:2019-05-15 15:04:37
【问题描述】:

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

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

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

我根本无法更改数据源。

【问题讨论】:

  • 看看XmlSerializer,恕我直言,它最适合深度嵌套的数据结构。
  • 你有一个类似于文件系统的多层嵌套结构。仅解析结构而不跟踪分层,您将丢失大量信息。要正确解析此文件,您需要使用维护层的递归算法。如果您的计算机上有文件,则获取上次更改的日期将很有用,但您不想每次需要读取文件时都搜索整个 c:\ 驱动器。您想要跟踪文件夹。使用这个 xml 文件,您可以轻松地归档名称和整数值,但了解父级可能也很重要。

标签: c# xml serialization


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-25
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多