c# - 解析复杂的 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 的内部文本并尝试提取迭代不同字符的文本。
我不愿意将其反序列化为对象,否则只会将问题转移到强类型形式。
所有这些方法都感觉非常笨重且不可维护。我正在寻找处理/解析这些数据的最佳方式的建议或方向。
我根本无法更改数据源。
解决方案
如果有人想知道 - 我能够通过获取所有成员节点并忽略我不需要的不相关节点来解决我的问题。下面的代码给了我一个包含我感兴趣的所有值的字典。它当然不优雅,但可以完成工作。
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);
}
如您所见,我跳过了前几个而忽略了最后一个。如果数据发生变化,这显然会中断。
推荐阅读
- mongodb - mongodb:在其他文档中按条件查找所有记录
- html - 为什么标题框元素超出正文框元素?
- pyaudio - 如何在谷歌云外壳中安装 pyaudio 模块?
- php - 如何正确拆分包含 HTML 实体的 php 中的字符串
- javascript - PHP fputcsv函数不适用于对象数组
- javascript - 为什么在检查时跳过了函数并且未定义 onclick,尽管在脚本中定义了?
- css - 如何在 MUI Grid 中有不同的水平和垂直间距?
- python - 分页不适用于我的 Django 休息框架项目,我正在使用通用视图
- javascript - 尽管 URL 正确,Angular 路由器仍无法加载我的组件
- c# - .Net Core 控制台应用程序发布未在发布文件夹中创建任何文件