我们有一个包含大量数据的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");
感谢。
答案 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));
}