【发布时间】:2015-05-29 14:44:02
【问题描述】:
我现在正在用 C# 创建一个游戏,它使用 XML 来构建不同角色的技能。 (此文件包含属性,例如损坏,为简洁起见,在此示例中已删除。)
<Classes>
<Class name="Mage">
<skill name="Fireball">
</skill>
</Class>
<Class name="Knight">
<skill name="Slash">
</skill>
</Class>
.
.
.
</Classes>
我正在创建一个 XMLParser 类来根据每个角色的名称获取技能('XMLParser.getSkillsByName("Mage")' 返回技能列表)。
是否应该在游戏启动时解析这个XML文件,并将每组技能分配给相应的职业类型(法师、骑士等);还是应该在需要知道的基础上调用解析器?即,一旦玩家选择了他们的职业类型,该职业选择的构造函数将解析 XML 文件以查找与其关联的技能。
目前,我已经开始实施后一种选择。每个类类型都有一个基本类型“玩家”。玩家有一个方法可以根据名字获取一个类类型的技能——所以在每个角色的构造函数中,会有一行类似于
List<Skill> mySkills = base.getSkillsByName("Mage");
我只是问,因为我工作的地方正在做类似的事情,但他们在一开始就解析 XML,然后根据他们需要的对象列表从对象列表中调用。
【问题讨论】:
-
这取决于您的用例。如果它是一个巨大的
XML文件,并且您知道您只需要其中的一组属性(每次运行程序时可能是不同的一组),那么您也可以按需解析它。但是,如果您要经常在文件中弹跳,请一次性解析它。 -
是在启动时创建对象还是稍后生成它们取决于您希望如何处理对象的内存管理。顺便说一句,您是否使用 XMLSerializer 类来序列化/反序列化您的 XML 对象?
-
@EBrown 这很有道理。不过,我很担心类似于 John Wu 下面提到的问题。
-
@maniak1982 我正在使用 XMLTextReader。我不太了解“最佳 XML 解析实践”可能是什么,所以任何建议都将不胜感激
-
@ZachCleaver 解析
XML、XmlTextReader、LINQ to XML、XmlSerializer等的方法有多种。您选择的方式往往取决于严格性 i> 您的数据。 IE。布局是否经常更改,是否经常添加新的属性(不是实际的数据对象)等等。如果您的布局非常严格(不经常更改),那么我建议您阅读XmlSerializer on MSDN。