c# - 用 C# 将困难的 XML 读入列表的最佳方法

我需要从 C# 中的 XML 中读取 values 。这里的 XML 只是整个 XML 的一小部分。这是一个存档游戏。由于复杂的性质,反序列化可能不起作用。

<Profession>
  <StrengthSkills>
    <strengthSkills size="3">
      <i0>
        <skillKey>25</skillKey>
        <skillLevel>1</skillLevel>
        <accuracyLevel>0</accuracyLevel>
        <damageLevel>0</damageLevel>
        <staminaLevel>0</staminaLevel>
        <chanceLevel>0</chanceLevel>
      </i0>
      <i1>
        <skillKey>41</skillKey>
        <skillLevel>1</skillLevel>
        <accuracyLevel>0</accuracyLevel>
        <damageLevel>0</damageLevel>
        <staminaLevel>0</staminaLevel>
        <chanceLevel>0</chanceLevel>
      </i1>
      <i2>
        <skillKey>12</skillKey>
        <skillLevel>1</skillLevel>
        <accuracyLevel>0</accuracyLevel>
        <damageLevel>0</damageLevel>
        <staminaLevel>0</staminaLevel>
        <chanceLevel>0</chanceLevel>
      </i2>
    </strengthSkills>
  </StrengthSkills>
  <DexteritySkills>
    <dexteritySkills size="2">
      <i0>
        <skillKey>105</skillKey>
        <skillLevel>1</skillLevel>
        <accuracyLevel>0</accuracyLevel>
        <damageLevel>0</damageLevel>
        <staminaLevel>0</staminaLevel>
        <chanceLevel>0</chanceLevel>
      </i0>
      <i1>
        <skillKey>131</skillKey>
        <skillLevel>1</skillLevel>
        <accuracyLevel>0</accuracyLevel>
        <damageLevel>0</damageLevel>
        <staminaLevel>0</staminaLevel>
        <chanceLevel>0</chanceLevel>
      </i1>
    </dexteritySkills>
  </DexteritySkills>
  <IntelligenceSkills>
    <intelligenceSkills size="1">
      <i0>
        <skillKey>208</skillKey>
        <skillLevel>1</skillLevel>
        <accuracyLevel>0</accuracyLevel>
        <damageLevel>0</damageLevel>
        <staminaLevel>0</staminaLevel>
        <chanceLevel>0</chanceLevel>
      </i0>
    </intelligenceSkills>
  </IntelligenceSkills>
  <CharismaSkills>
    <charismaSkills size="2">
      <i0>
        <skillKey>304</skillKey>
        <skillLevel>2</skillLevel>
        <accuracyLevel>0</accuracyLevel>
        <damageLevel>0</damageLevel>
        <staminaLevel>0</staminaLevel>
        <chanceLevel>0</chanceLevel>
      </i0>
      <i1>
        <skillKey>309</skillKey>
        <skillLevel>1</skillLevel>
        <accuracyLevel>0</accuracyLevel>
        <damageLevel>0</damageLevel>
        <staminaLevel>0</staminaLevel>
        <chanceLevel>0</chanceLevel>
      </i1>
    </charismaSkills>
  </CharismaSkills>
  <PerceptionSkills>
    <perceptionSkills size="1">
      <i0>
        <skillKey>405</skillKey>
        <skillLevel>1</skillLevel>
        <accuracyLevel>0</accuracyLevel>
        <damageLevel>0</damageLevel>
        <staminaLevel>0</staminaLevel>
        <chanceLevel>0</chanceLevel>
      </i0>
    </perceptionSkills>
  </PerceptionSkills>
  <FortitudeSkills>
    <fortitudeSkills size="1">
      <i0>
        <skillKey>500</skillKey>
        <skillLevel>2</skillLevel>
        <accuracyLevel>0</accuracyLevel>
        <damageLevel>0</damageLevel>
        <staminaLevel>0</staminaLevel>
        <chanceLevel>0</chanceLevel>
      </i0>
    </fortitudeSkills>
  </FortitudeSkills>
</Profession>

我真的在努力解决这个问题。我希望这里有人可以帮助我。问题是 values 有节点(“i0”、“i1”等)似乎无法找到解决它们的好方法。

这是我用于 XML 的另一部分的,它做得很好:

public static List<GetSkills> SkillsList()
{
    return XDocument.Load(ProcessFile.tempFilePath)
      .Element("root")
      .Element("FamilyMembers")
      .Elements().Where(e => e.Name.LocalName.StartsWith("Member_"))
      .Select(p => GetSkillsForMember(p))
      .ToList();
}

但是,如果我对 XML 的这一部分尝试相同的操作,我会在 <i0> 部分中挣扎。

我的目标是将 values 放在一个列表中,以便能够更改它们,使用新的 values 添加新的 (ix) 节点,然后将它们放回那个 XML 中。输出 XML 遵循相同的构建非常重要。

回答1

我通过执行以下操作解决了它:

var skillsAmount = xDoc.Descendants("Profession").Descendants(skillType + "Skills").FirstOrDefault().Attribute("size").Value;
                    
var skillNum = new[]
{
    new {Nr = 14, Skill = "Str", Type = "strengthSkills"},
    new {Nr = 12, Skill = "Dex", Type = "dexteritySkills"},
    new {Nr = 17, Skill = "Int", Type = "intelligenceSkills"},
    new {Nr = 13, Skill = "Cha", Type = "charismaSkills"},
    new {Nr = 17, Skill = "Per", Type = "perceptionSkills"},
    new {Nr = 20, Skill = "For", Type = "fortitudeSkills"}

}.ToList();

foreach (var num in skillNum)
{

    for (int i = 0; i < Convert.ToInt32(skillsAmount); i++)
    {
        List<Skills> Skills = xDoc
            .Descendants("Profession")
            .Descendants(skillNum.Type)
            .Descendants("i" + i)
            .Select(q => new Skills()
                {
                    SkillKey = q.Element("skillKey").Value,
                    SkillLevel = q.Element("skillLevel").Value
                })
                .ToList();
    }
}

相似文章

perl - cpan 模块安装失败,没有缺少先决条件

只是试图安装一个CPAN模块,似乎没有缺少任何先决条件,并且似乎找不到任何指向我需要做些什么来解决这个问题。有人可以理解问题可能是什么吗?除非我绝对确定它可能只是测试的问题,否则我宁愿不强制安装。我查...