【问题标题】:Save XML into list or array?将 XML 保存到列表或数组中?
【发布时间】:2015-09-24 19:15:12
【问题描述】:

我们有一个包含大量数据的 60 万行 XML 文件。在所有数据中,我需要读取的是节点<mv>,而知道我要读取哪个<mv>的方法是因为它内部有一个元素<mod>,其文本以“ValueAssigned =1,函数=1,Id="

这无论如何都不是一个完整的 XML 字符串,但这将是某种的例子。

最终结果是将每个Id 与其在<t> 中的值相匹配。

<mv>
<mod>ValueAssigned=1, Function=1, Id=1</mod>
<t>123</t>
<t>20</t>
<t>10</t>
<t>40</t>
</mv>
<mv>
<mod>ValueAssigned=1, Function=1, Id=2</mod>
<t>300</t>
<t>21</t>
<t>56</t>
<t>30</t>
</mv>

结果是将其保存到表格中。我不需要帮助将数据保存到表中,但我确实需要帮助尝试将所有这些部分保存到某种类型的列表中:

ID  Value
1   123
1   20
1   10
1   40
2   300
2   21
2   56
2   30

我正在考虑这样的事情,但我还没有尝试过:

string textToFind = "ValueAssigned=1, Function=1, Id=";
IEnumerable<XElement> query1 = doc.Descendants("mod").Where(c => c.Value == TextToFind).Ancestors("mv");

谢谢。

【问题讨论】:

  • @WinterMute 该xml文件的设计者需要了解xml
  • 我在想这样的东西,但我还没有尝试过。所以试一试,如果它不起作用,我们可以提供帮助。

标签: c# .net xml linq c#-4.0


【解决方案1】:

您可以将您的 xml 转换为 Dictionary&lt;string,List&lt;int&gt;&gt;

Dictionary<string,List<int>> dict = 
                XDocument.Load(filename)
                .Descendants("mv")
                .ToDictionary(x => Regex.Match((string)x.Element("mod"), @"Id=(\d+)")
                                        .Groups[1].Value,
                              x=>x.Elements("t").Select(t=>(int)t).ToList());

完整的工作代码:

string xml = @"
<root>
    <mv>
        <mod>ValueAssigned=1, Function=1, Id=1</mod>
        <t>123</t>
        <t>20</t>
        <t>10</t>
        <t>40</t>
    </mv>
    <mv>
        <mod>ValueAssigned=1, Function=1, Id=2</mod>
        <t>300</t>
        <t>21</t>
        <t>56</t>
        <t>30</t>
    </mv>
</root>
";

Dictionary<string,List<int>> dict = 
                XDocument.Parse(xml)
                .Descendants("mv")
                .ToDictionary(x => Regex.Match((string)x.Element("mod"), @"Id=(\d+)").Groups[1].Value,
                              x=>x.Elements("t").Select(t=>(int)t).ToList());

foreach(var kv in dict)
{
    Console.WriteLine("ID: {0}  Ts: {1}", kv.Key, string.Join(",", kv.Value));
}

【讨论】:

  • 你打败了我。您可能想在.Descendants("mv") 之后添加.Where(x =&gt; x.Element("mod") != null &amp;&amp; x.Element("mod").Value.StartsWith("ValueAssigned=1, Function=1"))
  • 谢谢。不幸的是,我得到“根级别的数据无效。第 1 行,位置 1。”。显然,这不是一个格式良好的 XML 文件,我无法在 XML 编辑器的浏览器中正确打开它。
猜你喜欢
  • 2021-07-28
  • 1970-01-01
  • 2012-07-02
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 2019-12-03
相关资源
最近更新 更多