使用 c# 直接在类中读取 XML 文件

本文关键字:读取 XML 文件 使用 | 更新日期: 2023-09-27 18:36:09

我对使用 XML 在我实际管理的 C# 中定义对象很陌生,但必须有更好的方法。

我的游戏数据库的数据在几个XML文件中结构化,这是我使用它进行测试时更详细的文件之一

<GameData xmlns:NSW="Napivo.StarWars">
<!-- Ships -->
<!-- AITroopAccelerator -->
<Asset Type="ShipDescription">
<Name>AITroopAccelerator</Name>
<Asset Type="SpriteAnimation">
  <Name>'Ships'AITroopAccelerator'1.png</Name>
  <Name>'Ships'AITroopAccelerator'2.png</Name>
  <Name>'Ships'AITroopAccelerator'3.png</Name>
  <Name>'Ships'AITroopAccelerator'2.png</Name>
  <Speed>150</Speed>
</Asset>
<Asset Type="WeaponGroup" Num ="0">
  <Weapon Name ="Missile" Angle ="0" X ="0" Y ="0"> </Weapon>
<Asset Type="WeaponGroup" Num ="1">
  <Weapon Name ="NegativeEnergyFlare" Angle ="180" X ="0" Y ="0"> </Weapon>
</Asset>
  <Weapon Name ="Lightning" Angle ="0" X ="0" Y ="0"> </Weapon>
</Asset>
<Asset Type="WeaponGroup" Num ="2">
  <Weapon Name ="FastLazer" Angle ="-10" X ="0" Y ="0"> </Weapon>
  <Weapon Name ="FastLazer" Angle ="+10" X ="0" Y ="0"> </Weapon>
  <Weapon Name ="Ion" Angle ="-90" X ="0" Y ="0"> </Weapon> 
</Asset>
<Asset Type="Armory">
  <Resource Type ="Energy" Ammout ="-1000" Recharge ="0.2"></Resource>
  <Resource Type ="Missile" Ammout ="-10" Recharge ="0"></Resource>
</Asset>
<HullStrength>100</HullStrength>
<ShieldStrength>100</ShieldStrength>

<ColorMask>'Ships'AITroopAccelerator'ColorMask.png</ColorMask>
<Scale>1</Scale>

这是我需要编写的代码,以制作此 xml 文件的正面或反面......

private void ReadShipDescription(XmlNode node)
    {
        ShipDescription sd = new ShipDescription();

        XmlNodeList NL = node.ChildNodes;
        foreach (XmlNode n in NL)
        {
            Console.WriteLine("{0} = {1}", n.Name, n.Value);
            if (n.Name == "Name")
            {
                sd.Name = n.InnerText;
            }
            if (n.Name == "Scale")
            {
                sd.Scale = float.Parse(n.InnerText);
            }
            if (n.Name == "HullStrength")
            {
                sd.HullStrength = float.Parse(n.InnerText);
            }
            if (n.Name == "ShieldStrength")
            {
                sd.ShieldStrength = float.Parse(n.InnerText);
            }
            if (n.Attributes != null)
            {
                foreach (XmlAttribute a in n.Attributes)
                {
                    if ((n.Name == "Asset") && (a.Name == "Type") && (a.Value == "SpriteAnimation"))
                    {
                        sd.HullAnimation = ReadSpriteAnimation(n);
                    }
                    if ((n.Name == "Asset") && (a.Name == "Type") && (a.Value == "WeaponGroup"))
                    {
                        sd.WeaponGroups.Add(ReadWeaponGroup(n));
                    }
                    if ((n.Name == "Asset") && (a.Name == "Type") && (a.Value == "Armory"))
                    {
                        XmlNode childnode = n.FirstChild;
                        while (childnode != null)
                        {
                            ResourceDescription rd = ReadResource(childnode);
                            if (rd.Ammount < 0)
                            {
                                rd.Ammount = float.PositiveInfinity;
                            }
                            sd.Armory.Add(rd);
                            childnode = childnode.NextSibling;
                        }
                    }
                    Console.WriteLine("{0} = {1}", a.Name, a.Value);
                }
            }
            if (n.Name == "ColorMask")
            {
                sd.ColorMask = n.InnerText;
            }
        }
        ShipDescriptions.Add(sd.Name, sd);
    }

这对我来说似乎不对。

任何人都可以把我送到一个可以学习如何直接从XML读取对象到类或结构的地方吗?

希望我不会为此获得太多的反对票。

谢谢。

使用 c# 直接在类中读取 XML 文件

可以使用 xsd 命令生成与 XML 匹配的 C# 类:

xsd gamedata.xml   <- creates gamedata.xsd
xsd GameData.xsd /classes

(有关更多详细信息,请参阅从 XML 生成 C# 类)

然后将 XML 直接反序列化为一组对象:http://msdn.microsoft.com/en-us/library/fa420a9y.aspx

为此,

只需首先加载您的 xml 文件并执行所需的操作。以下是您可以了解其中某些部分的链接

http://www.dotnetcurry.com/ShowArticle.aspx?ID=564

还可以将 XML 反序列化为 C# 类,并在代码中使用该类。然后,例如,您可以编写扩展方法。ToShipDescription() 获取 ShipDescription() 类型的对象。