ElementParser.cs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. using fun.Core;
  2. using fun.IO.Data;
  3. using System;
  4. using System.Xml;
  5. using System.Linq;
  6. namespace fun.IO.Parsers
  7. {
  8. internal sealed class ElementParser : Parser
  9. {
  10. private IElementDataStore data;
  11. public ElementParser(IElementDataStore data)
  12. {
  13. this.data = data;
  14. this.parsers = new Parser[]
  15. {
  16. new Vector3Parser(data),
  17. new StringParser(data)
  18. };
  19. }
  20. public override bool TryParse(XmlNode node)
  21. {
  22. return node.Name == typeof(Element).Name;
  23. }
  24. public override void Parse(XmlNode node)
  25. {
  26. var typename = node.Attributes[typeof(Type).Name].Value;
  27. var props = node.Attributes.OfType<XmlAttribute>().Where(a => a.Value != typeof(Type).Name);
  28. var lastElement = data.Element;
  29. foreach (var assembly in data.Assemblys)
  30. foreach (var type in assembly.ExportedTypes)
  31. if (type.Name == typename)
  32. data.PushElement(type);
  33. if (data.Element == null)
  34. throw new XmlException(typename + " does not exist.");
  35. foreach (var att in node.Attributes.OfType<XmlAttribute>())
  36. if (att.Name != typeof(Type).Name)
  37. foreach (var parser in parsers)
  38. if (parser.TryParse(att))
  39. parser.Parse(att);
  40. data.DepushElement();
  41. }
  42. }
  43. }