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