当XML文件条目格式不同时,使用LINQ将XML转换为字典

时间:2014-09-04 17:59:33

标签: c# xml linq dictionary linq-to-xml

我有以下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()));

1 个答案:

答案 0 :(得分:0)

这样的东西?

var dict = XDocument.Load(filename)
           .XPathSelectElements("/Offsets/*[offset]")
           .ToDictionary(x => x.Name.LocalName, 
                         x => x.Elements("offset").Select(o=>o.Value).ToList());