<?xml version="1.0" encoding="utf-8" ?>
<Hero>
<Legion>
<Andromeda>
<SpellOne>
<Name>Comet</Name>
<Icon>Images/Spell/Andromeda/Spell1.gif</Icon>
<Action>Target Unit</Action>
<Description>Andromeda rips a comet from her dimension to hurl at an enemy, damaging and stunning them.</Description>
<Ranks>
<First>
<ManaCost>95</ManaCost>
<Cooldown>10 Seconds</Cooldown>
<Effects>Deals 100 Magic damage and stuns target for 1.75 seconds.</Effects>
<ExtraEffects></ExtraEffects>
</First>
<Second>
<ManaCost>110</ManaCost>
<Cooldown>10</Cooldown>
<Effects>Deals 175 Magic damage and stuns target for 1.75 seconds.</Effects>
<ExtraEffects></ExtraEffects>
</Second>
<Third>
<ManaCost>125</ManaCost>
<Cooldown>10</Cooldown>
<Effects>Deals 250 Magic damage and stuns target for 1.75 seconds.</Effects>
<ExtraEffects></ExtraEffects>
</Third>
<Fourth>
<ManaCost>140</ManaCost>
<Cooldown>10</Cooldown>
<Effects>Deals 325 Magic damage and stuns target for 1.75 seconds.</Effects>
<ExtraEffects></ExtraEffects>
</Fourth>
</Ranks>
</SpellOne>
<SpellTwo>
<Name>Aurora</Name>
<Icon>Images/Spell/Andromeda/Spell2.gif</Icon>
<Action>Target Position</Action>
<Description>Andromeda shakes the magnetic field of Newerth, causing an Aurora to erupt, damage, and reduce the armor of all enemies in front of her.</Description>
<Ranks>
<First>
<ManaCost>40</ManaCost>
<Cooldown>15 Seconds</Cooldown>
<Effects>Deals 25 damage to targets in a line and applies Aurora for 15 seconds.</Effects>
<ExtraEffects>-5% Base Damage, -2 Armor</ExtraEffects>
</First>
<Second>
<ManaCost>40</ManaCost>
<Cooldown>15 Seconds</Cooldown>
<Effects>Deals 50 damage to targets in a line and applies Aurora for 15 seconds.</Effects>
<ExtraEffects>-10% Base Damage, -3 Armor</ExtraEffects>
</Second>
<Third>
<ManaCost>40</ManaCost>
<Cooldown>15 Seconds</Cooldown>
<Effects>Deals 75 damage to targets in a line and applies Aurora for 15 seconds.</Effects>
<ExtraEffects>-15% Base Damage, -4 Armor</ExtraEffects>
</Third>
<Fourth>
<ManaCost>40</ManaCost>
<Cooldown>15 Seconds</Cooldown>
<Effects>Deals 100 damage to targets in a line and applies Aurora for 15 seconds.</Effects>
<ExtraEffects>-20% Base Damage, -5 Armor</ExtraEffects>
</Fourth>
</Ranks>
</SpellTwo>
所以我的问题是,我是否正确格式化了XML?什么是正确的方法。只要我学会了为序列化/反序列化准备XML数据的正确方法,我不介意再从头开始重写1300行XML。
非常感谢SO。
答案 0 :(得分:4)
您的XML会向我发出两件事。如果我们谈论C#序列化,你的对象必须有一个类似于SpellOne,SpellTwo的属性,以及Ranks“First”,“Second”,“Third”和“Fourth”。
现在,如果这是一成不变的,并且不可能增加/减少等级和/或法术的数量,那可能并不可怕。但是如果你为某种形式的角色或第5等级添加一个SpellThree,你必须更新你的对象。
我可能会提出类似
的建议<Spells>
<Spell id="1" />
<Spell id="2" />
</Spells>
然后拼写结构可以是相同的,你可以有一个带有List的C#对象,然后将被序列化/反序列化。
除此之外,您的格式看起来并不太糟糕。
您可能尝试的一件事是创建一个简单的小控制台应用程序,创建您的拼写对象,然后将其serailze为XML。看看它输出的结构,这将使你很好地了解如何格式化它。
答案 1 :(得分:2)
我过去做过这种事情的一种方法是采取相反的方法 - 使用我满意的结构编写域对象,然后将其序列化为XML。一旦完成,我将为它编写一个XSD,以便我可以在以后手动编辑XML。我采用这种方法是因为让域对象正确更重要,我并不真正关心XML看起来是什么样的,特别是在我有了XSD之后。
答案 2 :(得分:1)
构建可序列化对象模型。
创建并填充它的实例。
将其序列化为XML。
现在您知道输入XML需要的样子了。
一般来说,只要您不了解可以控制序列化XML格式的各种属性,那么值类型的每个属性都将如下所示:
<PropertyName>ValueSerializedToText</PropertyName>
并且每个引用类型的属性都将如下所示:
<PropertyName>
<Property1>Value</Property1>
<Property2>Value</Property2>
......等等。
因此,在您的示例中,可以期望XML反序列化为Hero
类型的对象,其Legion
属性包含具有Andromeda
属性的对象。也就是说,不,这不是你的XML应该是什么样子。
您实际拥有的是具有Hero
和Name
属性的Faction
对象,可能会像这样序列化:
<Hero>
<Faction>Hellbourne</Faction>
<Name>Corrupted Disciple</Name>
...
但所有这些都让人担心错误的事情。您不应该将注意力集中在想要XML的外观上。您应该专注于您需要的对象模型。这样做,XML序列化格式将自行处理。