C# 如何在c语言中将XML放入字典

C# 如何在c语言中将XML放入字典,c#,xml,dictionary,C#,Xml,Dictionary,我有以下XML: <Axis> <Collections> <Collection> <Client> <Name>Client 1</Name> <Value>345</Value> </Client> </Collection

我有以下XML:

<Axis>
    <Collections>
        <Collection>
            <Client>
                <Name>Client 1</Name> 
                <Value>345</Value> 
            </Client>
        </Collection>
        <Collection>
            <Client>
                <Name>Client 1</Name> 
                <Value>4532</Value> 
            </Client>
        </Collection>
        <Collection>
            <Client>
                <Name>Client 1</Name> 
                <Value>235</Value> 
            </Client>
        </Collection>
        <Collection>
            <Client>
                <Name>Client 1</Name> 
                <Value>8756</Value> 
            </Client>
        </Collection>
        <Collection>
            <Client>
                <Name>Client 1</Name> 
                <Value>76</Value> 
            </Client>
        </Collection>
    </Collections>
    <Collections>
        <Collection>
            <Client>
                <Name>Client 2</Name> 
                <Value>56</Value> 
            </Client>
        </Collection>
        <Collection>
            <Client>
                <Name>Client 2</Name> 
                <Value>43</Value> 
            </Client>
        </Collection>
        <Collection>
            <Client>
                <Name>Client 2</Name> 
                <Value>34</Value> 
            </Client>
        </Collection>
        <Collection>
            <Client>
                <Name>Client 3</Name> 
                <Value>42</Value> 
            </Client>
        </Collection>
        <Collection>
            <Client>
                <Name>Client 3</Name> 
                <Value>23</Value> 
            </Client>
        </Collection>
    </Collections>
</Axis>
我建议:

不使用XPath选择元素,而是使用elements方法等 通过ToLookup使用查找而不是字典。查找类似于一个字典,每个键有多个值,但处理起来稍微简单一些,因为如果您请求缺少一个键,它将返回一个空序列,并且更容易构造。 所以代码看起来像:

var lookup = doc.Root
                .Elements("Collections")
                .Elements("Collection")
                .Elements("Client")
                .ToLookup(x => (string) x.Element("Name"),
                          x => (string) x.Element("Value"));
然后,您可以执行以下操作:

foreach (var value in lookup["Client 1"])
{
    ...
}
所有元素调用的替代方法是使用子体,例如

我建议:

不使用XPath选择元素,而是使用elements方法等 通过ToLookup使用查找而不是字典。查找类似于一个字典,每个键有多个值,但处理起来稍微简单一些,因为如果您请求缺少一个键,它将返回一个空序列,并且更容易构造。 所以代码看起来像:

var lookup = doc.Root
                .Elements("Collections")
                .Elements("Collection")
                .Elements("Client")
                .ToLookup(x => (string) x.Element("Name"),
                          x => (string) x.Element("Value"));
然后,您可以执行以下操作:

foreach (var value in lookup["Client 1"])
{
    ...
}
所有元素调用的替代方法是使用子体,例如


我建议使用允许查询的构造,我个人最喜欢查询XML的是Linq to XML

首先,获取名称和值之后的内容。 然后,在名称上分组 最后,向您的目标输入一个字典 示例:您可以将其直接复制并粘贴到LinqPad中:

var xml = @"<Axis>
<Collections>
   <Collection>
       <Client>
           <Name>Client 1</Name> 
           <Value>345</Value> 
       </Client>
   </Collection>
   <Collection>
       <Client>
           <Name>Client 1</Name> 
           <Value>4532</Value> 
       </Client>
   </Collection>
   <Collection>
       <Client>
           <Name>Client 1</Name> 
           <Value>235</Value> 
       </Client>
   </Collection>
   <Collection>
       <Client>
           <Name>Client 1</Name> 
           <Value>8756</Value> 
       </Client>
   </Collection>
   <Collection>
       <Client>
           <Name>Client 1</Name> 
           <Value>76</Value> 
       </Client>
   </Collection>
</Collections>
<Collections>
   <Collection>
       <Client>
           <Name>Client 2</Name> 
           <Value>56</Value> 
       </Client>
   </Collection>
   <Collection>
       <Client>
           <Name>Client 2</Name> 
           <Value>43</Value> 
       </Client>
   </Collection>
   <Collection>
       <Client>
           <Name>Client 2</Name> 
           <Value>34</Value> 
       </Client>
   </Collection>
   <Collection>
       <Client>
           <Name>Client 3</Name> 
           <Value>42</Value> 
       </Client>
   </Collection>
   <Collection>
       <Client>
           <Name>Client 3</Name> 
           <Value>23</Value> 
       </Client>
   </Collection>
</Collections>
</Axis>";

var doc = XDocument.Parse(xml);
var dict = (from row in doc.Root.Descendants("Client")
            let name = row.Element("Name").Value
            let value = row.Element("Value").Value
            group value by name into grp
            select new { grp.Key, Values = grp.ToList() }).ToDictionary(d => d.Key, d => d.Values);
dict.Dump();

我建议使用允许查询的构造,我个人最喜欢查询XML的是Linq to XML

首先,获取名称和值之后的内容。 然后,在名称上分组 最后,向您的目标输入一个字典 示例:您可以将其直接复制并粘贴到LinqPad中:

var xml = @"<Axis>
<Collections>
   <Collection>
       <Client>
           <Name>Client 1</Name> 
           <Value>345</Value> 
       </Client>
   </Collection>
   <Collection>
       <Client>
           <Name>Client 1</Name> 
           <Value>4532</Value> 
       </Client>
   </Collection>
   <Collection>
       <Client>
           <Name>Client 1</Name> 
           <Value>235</Value> 
       </Client>
   </Collection>
   <Collection>
       <Client>
           <Name>Client 1</Name> 
           <Value>8756</Value> 
       </Client>
   </Collection>
   <Collection>
       <Client>
           <Name>Client 1</Name> 
           <Value>76</Value> 
       </Client>
   </Collection>
</Collections>
<Collections>
   <Collection>
       <Client>
           <Name>Client 2</Name> 
           <Value>56</Value> 
       </Client>
   </Collection>
   <Collection>
       <Client>
           <Name>Client 2</Name> 
           <Value>43</Value> 
       </Client>
   </Collection>
   <Collection>
       <Client>
           <Name>Client 2</Name> 
           <Value>34</Value> 
       </Client>
   </Collection>
   <Collection>
       <Client>
           <Name>Client 3</Name> 
           <Value>42</Value> 
       </Client>
   </Collection>
   <Collection>
       <Client>
           <Name>Client 3</Name> 
           <Value>23</Value> 
       </Client>
   </Collection>
</Collections>
</Axis>";

var doc = XDocument.Parse(xml);
var dict = (from row in doc.Root.Descendants("Client")
            let name = row.Element("Name").Value
            let value = row.Element("Value").Value
            group value by name into grp
            select new { grp.Key, Values = grp.ToList() }).ToDictionary(d => d.Key, d => d.Values);
dict.Dump();