Advertisement
imk0tter

ROTMG XML Parser

Oct 5th, 2013
327
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.83 KB | None | 0 0
  1. public class XMLEntry
  2.     {
  3.         private int id = -1;
  4.         private string name = "";
  5.         private string type = "";
  6.  
  7.         private string text;
  8.  
  9.         private Dictionary<string, XMLEntry> children;
  10.         private Dictionary<int, XMLEntry> group;
  11.         private Dictionary<string, string> attributes;
  12.  
  13.         public XMLEntry(XmlReader r)
  14.         {
  15.             this.children = new Dictionary<string, XMLEntry>();
  16.             this.group = new Dictionary<int, XMLEntry>();
  17.             this.attributes = new Dictionary<string, string>();
  18.             this.type = r.Name;
  19.  
  20.             if (type == "Object" || type == "Ground")
  21.             {
  22.                 id = Convert.ToInt32(r.GetAttribute("type"), 16);
  23.                 name = r.GetAttribute("id");
  24.             }
  25.             ParseXML(r);
  26.             group.Add(group.Count, this);
  27.  
  28.         }
  29.         public XMLEntry(string name)
  30.         {
  31.             this.type = name;
  32.         }
  33.         private void ParseXML(XmlReader r)
  34.         {
  35.             Stack<XMLEntry> stack = new Stack<XMLEntry>();
  36.             do
  37.             {
  38.                 switch (r.NodeType)
  39.                 {
  40.                     case XmlNodeType.Element:
  41.                         if (r.HasAttributes && r.Name == type)
  42.                         {
  43.                             Console.WriteLine("Setting '{0}'='{2}' attributes: Quantity {1}", type, r.AttributeCount, name);
  44.                             for (int i = 0; i < r.AttributeCount; ++i)
  45.                             {
  46.                                 r.MoveToAttribute(i);
  47.                                 Console.WriteLine("Adding attribute '{0}' of value '{1}'", r.Name, r.Value);
  48.                                 attributes.Add(r.Name, r.Value);  
  49.                             }
  50.                             r.MoveToElement();
  51.                         }
  52.                         if (r.Name != type)
  53.                         {
  54.                             if (children.ContainsKey(r.Name))
  55.                             {
  56.                                 Console.WriteLine("Adding '{0}' to group dictionary of '{1}'", r.Name, type);
  57.                                 children[r.Name].AddGroup(new XMLEntry(r));
  58.                             }
  59.                             else
  60.                             {
  61.                                 Console.WriteLine("Adding '{0}' to children dictionary of '{1}'", r.Name, type);
  62.                                 children.Add(r.Name, new XMLEntry(r));
  63.                             }
  64.                         }
  65.                         else
  66.                         {
  67.                             if (r.IsEmptyElement)
  68.                                 return;
  69.                         }
  70.                         break;
  71.                     case XmlNodeType.Text:
  72.                         Console.WriteLine("Setting text of {0} to {1}", type, r.Value);
  73.                         this.text = r.Value;
  74.                         break;
  75.                     case XmlNodeType.EndElement:
  76.                         if (r.Name == type)
  77.                         {
  78.                             Console.WriteLine("Finalizing element: '{0}'=''", type, name);
  79.                             return;
  80.                         }
  81.                         else
  82.                         {
  83.                             Console.Write("Weird stuff happuned");
  84.                             return;
  85.                         }
  86.                         break;
  87.                     default:
  88.                         break;
  89.                 }
  90.             } while (r.Read());
  91.         }
  92.         public int GroupCount()
  93.         {
  94.             return group.Count;
  95.         }
  96.         public XMLEntry GetGroup(int id)
  97.         {
  98.             if (group.ContainsKey(id))
  99.                 return group[id];
  100.             return null;
  101.         }
  102.         public bool Contains(string type)
  103.         {
  104.             if (children.ContainsKey(type))
  105.                 return true;
  106.             return false;
  107.         }
  108.         public void AddGroup(XMLEntry i)
  109.         {
  110.             group.Add(group.Count, i);
  111.         }
  112.         public void AddChild(string type, XMLEntry i)
  113.         {
  114.             this.children.Add(type, i);
  115.         }
  116.         public XMLEntry GetProperty(string type)
  117.         {
  118.             if (children.ContainsKey(type))
  119.                 return children[type];
  120.             return null;
  121.         }
  122.         public int GetPropertyCount()
  123.         {
  124.             return children.Count;
  125.         }
  126.         public string Type
  127.         {
  128.             get { return type; }
  129.         }
  130.         public string Name
  131.         {
  132.             get { return name; }
  133.         }
  134.         public string Text
  135.         {
  136.             get { return text; }
  137.             set { text = value; }
  138.         }
  139.         public int ID
  140.         {
  141.             get { return id; }
  142.         }
  143.  
  144.     }
  145.  
  146. public static class ObjectLibrary
  147.     {
  148.         public static Dictionary<int, XMLEntry> ObjectDictionary = new Dictionary<int, XMLEntry>();
  149.         public static Dictionary<int, XMLEntry> GroundDictionary = new Dictionary<int, XMLEntry>();
  150.         public static void ProcessXMLFiles(string path)
  151.         {
  152.             string[] xmlFiles = Directory.GetFiles(@path, "*.xml");
  153.  
  154.             foreach (string s in xmlFiles)
  155.             {
  156.                 Console.WriteLine("Processing object XML File: {0}", s);
  157.                 XmlReader reader = XmlReader.Create(s);
  158.  
  159.                 while (reader.Read())
  160.                 {
  161.                     switch (reader.NodeType)
  162.                     {
  163.                         case XmlNodeType.Element:
  164.                             if (reader.Name == "Object")
  165.                             {
  166.                                 XMLEntry ent = new XMLEntry(reader);
  167.                                 try
  168.                                 {
  169.                                     ObjectDictionary.Add(ent.ID, ent);
  170.                                 }
  171.                                 catch (Exception e)
  172.                                 {
  173.                                     Console.WriteLine("================= Element {1} is already present in the dictionary {0}====================", ObjectDictionary[ent.ID].Name, ent.ID);
  174.                                 }
  175.                             }
  176.                             break;
  177.                         default:
  178.                             Console.WriteLine("Skipped Node type: {0}", reader.NodeType);
  179.                             break;
  180.                     }
  181.                 }
  182.             }
  183.             xmlFiles = Directory.GetFiles(@(path + "GroundObjects/"));
  184.            
  185.  
  186.             foreach (string s in xmlFiles)
  187.             {
  188.                 Console.WriteLine("Processing ground object file: {0}", s);
  189.                 XmlReader r = XmlReader.Create(s);
  190.                 while (r.Read())
  191.                 {
  192.                     switch(r.NodeType)
  193.                     {
  194.                         case XmlNodeType.Element:
  195.                             if (r.Name == "Object" || r.Name == "Ground")
  196.                             {
  197.                                 XMLEntry ent = new XMLEntry(r);
  198.                                 try
  199.                                 {
  200.                                     ObjectDictionary.Add(ent.ID, ent);
  201.                                 }
  202.                                 catch (Exception e)
  203.                                 {
  204.                                     Console.WriteLine("================= Element {1} is already present in the dictionary {0}====================", ObjectDictionary[ent.ID].Name, ent.ID);
  205.                                 }
  206.                             }
  207.                             break;
  208.                         default:
  209.                             Console.WriteLine("Skipped Node type: {0}", r.NodeType);
  210.                             break;
  211.                     }
  212.                 }
  213.             }
  214.         }
  215.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement