我有以下XML(摘录):
<Offsets>
<PlayerStructBase>0xF24C10</PlayerStructBase>
<HP>
<offset>0x17e8</offset>
</HP>
<MaxHP>
<offset>0x17ec</offset>
</MaxHP>
<MP>
<offset>0x17f0</offset>
</MP>
<DistanceToTarget>
<offset>0xEB9A98</offset>
<offset>0x17f0</offset>
</DistanceToTarget>
</Offsets>
我想用LINQ来读它,然后把它变成一个字典。我无法想象使用其他帖子/ Google是如何在每个条目(HP,MP等)可能具有从一个到多个偏移的任何内容时执行此操作,并且它们都具有相同的元素名称:&#34; offset&# 34。)
有什么好主意吗?
修改
我忘了提到输出字典应该是:Dictionary<string, IntPtr>
。我有一个方法,在循环中将int []转换为IntPtr:pointers [i] = Utils.getPointerFromBaseOffsets(ProcessHandle,_baseAddress,offsets [i]);.也许有一些方法可以在创建字典时直接设置这些IntPtr?或者我首先必须用int []填充它然后在循环中覆盖每个值?如果是后者,我该怎么做?
更新:我最终修改了XML,因此PlayerStructBase十六进制被包装在 offset 元素中,就像XML中的其他条目一样。然后我就这样做了:
//Load Offset list
var offsetXElement = XDocument.Load(path + @"\Offsets.xml").Root;
if (offsetXElement != null)
OffsetDictionary =
offsetXElement.Elements()
.ToDictionary(o => o.Name.LocalName,
o => MemoryHandler.Instance.GetPointerFromBaseOffsets(o.Elements().Select(x => int.Parse(x.Value.Substring(2), NumberStyles.AllowHexSpecifier)).ToArray()));
答案 0 :(得分:0)
这样的东西?
var dict = XDocument.Load(filename)
.XPathSelectElements("/Offsets/*[offset]")
.ToDictionary(x => x.Name.LocalName,
x => x.Elements("offset").Select(o=>o.Value).ToList());