具有多个值的相同键的表单字典解析xml

时间:2014-03-19 06:24:34

标签: c# asp.net .net wpf dictionary

我的xml格式是这个

<?xml version='1.0' encoding='us-ascii'?> 
<root>
<key value="22.wav">
<Index>18</Index>
</key>
<key value="EFG.wav">
<Index>5</Index>
<Index>14</Index>
</key>
</root>

我如何形成字典?

3 个答案:

答案 0 :(得分:0)

以下是解析xml文件并填充字典的方法

Dictionary<string, int[]> keyIndexCollection = new Dictionary<string, int[]>();
XmlDocument doc = new XmlDocument();
doc.Load("input.xml");
XmlNodeList keyNodeList = doc.SelectNodes("root/key");
List<int> indexValues = new List<int>();
foreach (XmlNode node in keyNodeList)
{
    XmlNodeList indexNodeList = node.SelectNodes("Index");
    int parsedIndex;
    indexValues.Clear();
    foreach (XmlNode indexNode in indexNodeList)
    {
        if (int.TryParse(indexNode.InnerText, out parsedIndex))
        {
            indexValues.Add(parsedIndex);
        }
    }

    keyIndexCollection.Add(node.Attributes["value"].Value, indexValues.ToArray());
}

这是一个用于迭代字典的示例代码

foreach (string key in keyIndexCollection.Keys)
{
    int[] values = keyIndexCollection[key];

    Console.WriteLine("Key = " + key);
    foreach (int value in values)
    {
        Console.WriteLine("\tValue = " + value);
    }
}

答案 1 :(得分:0)

你可以这样做:

var doc = XDocument.Load("path_to_xml_file.xml");
Dictionary<string, int[]> dictionary = new Dictionary<string, int[]>();
foreach (var key in doc.Root.Elements("key"))
{
    dictionary.Add((string)key.Attribute("value"), key.Elements("Index").Select(o => int.Parse((string)o)).ToArray());
}

或使用.ToDictionary()扩展方法进行简化:

var dict = doc.Root
              .Elements("key")
              .ToDictionary(o => (string) o,
                            p => p.Elements("Index").Select(o => int.Parse((string) o)).ToArray());

答案 2 :(得分:0)

如果您像这样加载XML:

var xd = XDocument.Load("path_to_xml_file.xml");

然后你可以创建两个不同的词典:

var dict1 = 
    xd
        .Document
        .Root
        .Elements("key")
        .ToDictionary(
            x => x.Attribute("value").Value,
            x => x.Elements("Index")
                .Select(y => y.Value)
                .ToArray());


    var dict2 = 
    xd
        .Document
        .Root
        .Elements("key")
        .SelectMany(x => x
            .Elements("Index")
            .Select(y => new { x = x.Attribute("value").Value, y = y.Value }))
        .ToDictionary(x => x.y, x => x.x);

这些结果如下:

Results

我怀疑你想要第一个。