Here is the first step in a) saving a weapon library in an XML file, and b) reading the library if such a file exists.
Run the following code twice to see both behaviors.
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace SO
{
public enum WeaponCategory
{
Cosmetic,
Blunt,
Cutting,
Piercing,
Magic,
}
public class Weapon
{
[XmlAttribute]
public string Name { get; set; }
[XmlAttribute]
public float Damage { get; set; }
[XmlAttribute]
public float Speed { get; set; }
[XmlAttribute]
public int MinLevel { get; set; }
[XmlAttribute]
public WeaponCategory Category { get; set; }
public override string ToString()
=> $"{Name} : (Category={Category}, Damage={Damage}, Speed={Speed}, Min={MinLevel})";
}
public class WeaponLibrary
{
public WeaponLibrary()
{
Weapons = new List<Weapon>();
}
public static WeaponLibrary FromXml(string xml)
{
var fs = new StringReader(xml);
var settings = new XmlReaderSettings()
{
CloseInput = true,
IgnoreWhitespace = true,
IgnoreComments = true
};
var xr = XmlReader.Create(fs, settings);
var xs = new XmlSerializer(typeof(WeaponLibrary));
var result = xs.Deserialize(xr) as WeaponLibrary;
xr.Close();
return result;
}
public List<Weapon> Weapons { get; }
[XmlAttribute]
public string Realm { get; set; }
public string ToXml()
{
var sb = new StringBuilder();
var settings = new XmlWriterSettings()
{
Encoding = Encoding.UTF7,
Indent = true,
CloseOutput = true,
};
var xw = XmlWriter.Create(sb, settings);
var xs = new XmlSerializer(typeof(WeaponLibrary));
// Ref: https://stackoverflow.com/a/935749/380384
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
xs.Serialize(xw, this, ns);
xw.Close();
return sb.ToString();
}
}
class Program
{
static void Main(string[] args)
{
var filename = "Weapons.xml";
WeaponLibrary library;
if (File.Exists(filename))
{
library = ReadLibrary(filename);
}
else
{
library = CreateLibrary(filename);
#if DEBUG
Process.Start(filename);
#endif
}
Console.WriteLine($"Weapon Library for {library.Realm}:");
foreach (var item in library.Weapons)
{
Console.WriteLine(item);
}
}
static WeaponLibrary CreateLibrary(string filename)
{
var weps = new WeaponLibrary
{
Realm = "Umbra"
};
weps.Weapons.Add(new Weapon() { Category = WeaponCategory.Cutting, Name = "Longsword", MinLevel = 10, Damage = 100f, Speed = 5f });
weps.Weapons.Add(new Weapon() { Category = WeaponCategory.Piercing, Name = "Dagger", MinLevel = 1, Damage = 30f, Speed = 2.0f });
weps.Weapons.Add(new Weapon() { Category = WeaponCategory.Blunt, Name = "Mace", MinLevel = 3, Damage = 130f, Speed = 8f });
weps.Weapons.Add(new Weapon() { Category = WeaponCategory.Magic, Name = "Staff", MinLevel = 14, Damage = 50f, Speed = 1.7f });
var xml = weps.ToXml();
File.WriteAllText(filename, xml);
return weps;
}
static WeaponLibrary ReadLibrary(string filename)
{
var xml = File.ReadAllText(filename);
return WeaponLibrary.FromXml(xml);
}
}
}
and the resulting XML file
<?xml version="1.0" encoding="utf-16"?>
<WeaponLibrary Realm="Umbra">
<Weapons>
<Weapon Name="Longsword" Damage="100" Speed="5" MinLevel="10" Category="Cutting" />
<Weapon Name="Dagger" Damage="30" Speed="2" MinLevel="1" Category="Piercing" />
<Weapon Name="Mace" Damage="130" Speed="8" MinLevel="3" Category="Blunt" />
<Weapon Name="Staff" Damage="50" Speed="1.7" MinLevel="14" Category="Magic" />
</Weapons>
</WeaponLibrary>
The second time the code runs, it read the above XML file and populates the list of Weapon
. Here are the contents of the list:
Weapon Library for Umbra:
Longsword : (Category=Cutting, Damage=100, Speed=5, Min=10)
Dagger : (Category=Piercing, Damage=30, Speed=2, Min=1)
Mace : (Category=Blunt, Damage=130, Speed=8, Min=3)
Staff : (Category=Magic, Damage=50, Speed=1.7, Min=14)