2014-09-04 37 views
0

变化,我有以下XML(节选):使用LINQ把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来读它,然后把它变成一个字典。我无法用其他帖子/谷歌的数字来说明当每个条目(HP,MP等)可能具有从一个偏移量到多个偏移量的任何东西时,如何做到这一点,并且它们都具有相同的元素名称:“偏移”)。

任何好点子?

编辑: 我忘了提及输出词典应该是:Dictionary<string, IntPtr>。我有一个方法可以在循环中将int []转换为IntPtr:pointers [i] = Utils.getPointerFromBaseOffsets(ProcessHandle,_baseAddress,offsetsets [i]);.也许有一些方法可以在创建字典时直接设置这些IntPtr?或者我首先必须用int []填充它,然后在循环中覆盖每个值?如果后者,我会怎么做?


UPDATE:我结束了修改XML所以PlayerStructBase六角被包裹在一个偏移元件,如在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

如果这个结构没有改变,它可能适合更好的类而不是字典。 – Mephy 2014-09-04 18:22:47

+0

@Mephy只有一个字段的类(int []偏移量)?似乎有点矫枉过正? – Magnus 2014-09-05 09:10:14

+0

@Mephy Ment IntPtr作为唯​​一的字段,而不是int []。 – Magnus 2014-09-05 09:21:28

回答

0

这样的事情?

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

对不起,我忘了提到输出字典应该是:Dictionary 。我有一个方法可以在循环中将int []转换为IntPtr:pointers [i] = Utils.getPointerFromBaseOffsets(ProcessHandle,_baseAddress,offsetsets [i]);.也许有一些方法可以在创建字典时直接设置这些IntPtr?或者我首先必须用int []填充它,然后在循环中覆盖每个值? – Magnus 2014-09-05 09:18:02

+0

@Magnus更改最后一行为:'x => x.Elements(“offset”)。Select(o => new IntPtr(int.Parse(o.Value.Substring(2),NumberStyles.HexNumber)))。ToList ());' – 2014-09-05 17:49:03