将XML保存到列表或数组中?

时间:2015-09-24 19:15:13

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

我们有一个包含大量数据的600K行XML文件。在所有数据中,我需要阅读的是节点<mv>,以及了解我想要读取哪个<mv>的方法是因为它内部有一个元素<mod>,文本开头“ValueAssigned = 1,Function = 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");

感谢。

1 个答案:

答案 0 :(得分:2)

您可以将xml转换为Dictionary<string,List<int>>

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