You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			427 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C#
		
	
			
		
		
	
	
			427 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C#
		
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Text;
 | |
| using UnityEngine;
 | |
| 
 | |
| namespace FairyGUI.Utils
 | |
| {
 | |
|     /// <summary>
 | |
|     /// A simplest and readonly XML class
 | |
|     /// </summary>
 | |
|     public class XML
 | |
|     {
 | |
|         public string name;
 | |
|         public string text;
 | |
| 
 | |
|         Dictionary<string, string> _attributes;
 | |
|         XMLList _children;
 | |
| 
 | |
|         public static XML Create(string tag)
 | |
|         {
 | |
|             XML xml = new XML();
 | |
|             xml.name = tag;
 | |
|             return xml;
 | |
|         }
 | |
| 
 | |
|         public XML(string XmlString)
 | |
|         {
 | |
|             Parse(XmlString);
 | |
|         }
 | |
| 
 | |
|         private XML()
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         public Dictionary<string, string> attributes
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 if (_attributes == null)
 | |
|                     _attributes = new Dictionary<string, string>();
 | |
|                 return _attributes;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public bool HasAttribute(string attrName)
 | |
|         {
 | |
|             if (_attributes == null)
 | |
|                 return false;
 | |
| 
 | |
|             return _attributes.ContainsKey(attrName);
 | |
|         }
 | |
| 
 | |
|         public string GetAttribute(string attrName)
 | |
|         {
 | |
|             return GetAttribute(attrName, null);
 | |
|         }
 | |
| 
 | |
|         public string GetAttribute(string attrName, string defValue)
 | |
|         {
 | |
|             if (_attributes == null)
 | |
|                 return defValue;
 | |
| 
 | |
|             string ret;
 | |
|             if (_attributes.TryGetValue(attrName, out ret))
 | |
|                 return ret;
 | |
|             else
 | |
|                 return defValue;
 | |
|         }
 | |
| 
 | |
|         public int GetAttributeInt(string attrName)
 | |
|         {
 | |
|             return GetAttributeInt(attrName, 0);
 | |
|         }
 | |
| 
 | |
|         public int GetAttributeInt(string attrName, int defValue)
 | |
|         {
 | |
|             string value = GetAttribute(attrName);
 | |
|             if (value == null || value.Length == 0)
 | |
|                 return defValue;
 | |
| 
 | |
|             int ret;
 | |
|             if (int.TryParse(value, out ret))
 | |
|                 return ret;
 | |
|             else
 | |
|                 return defValue;
 | |
|         }
 | |
| 
 | |
|         public float GetAttributeFloat(string attrName)
 | |
|         {
 | |
|             return GetAttributeFloat(attrName, 0);
 | |
|         }
 | |
| 
 | |
|         public float GetAttributeFloat(string attrName, float defValue)
 | |
|         {
 | |
|             string value = GetAttribute(attrName);
 | |
|             if (value == null || value.Length == 0)
 | |
|                 return defValue;
 | |
| 
 | |
|             float ret;
 | |
|             if (float.TryParse(value, out ret))
 | |
|                 return ret;
 | |
|             else
 | |
|                 return defValue;
 | |
|         }
 | |
| 
 | |
|         public bool GetAttributeBool(string attrName)
 | |
|         {
 | |
|             return GetAttributeBool(attrName, false);
 | |
|         }
 | |
| 
 | |
|         public bool GetAttributeBool(string attrName, bool defValue)
 | |
|         {
 | |
|             string value = GetAttribute(attrName);
 | |
|             if (value == null || value.Length == 0)
 | |
|                 return defValue;
 | |
| 
 | |
|             bool ret;
 | |
|             if (bool.TryParse(value, out ret))
 | |
|                 return ret;
 | |
|             else
 | |
|                 return defValue;
 | |
|         }
 | |
| 
 | |
|         public string[] GetAttributeArray(string attrName)
 | |
|         {
 | |
|             string value = GetAttribute(attrName);
 | |
|             if (value != null)
 | |
|             {
 | |
|                 if (value.Length == 0)
 | |
|                     return new string[] { };
 | |
|                 else
 | |
|                     return value.Split(',');
 | |
|             }
 | |
|             else
 | |
|                 return null;
 | |
|         }
 | |
| 
 | |
|         public string[] GetAttributeArray(string attrName, char seperator)
 | |
|         {
 | |
|             string value = GetAttribute(attrName);
 | |
|             if (value != null)
 | |
|             {
 | |
|                 if (value.Length == 0)
 | |
|                     return new string[] { };
 | |
|                 else
 | |
|                     return value.Split(seperator);
 | |
|             }
 | |
|             else
 | |
|                 return null;
 | |
|         }
 | |
| 
 | |
|         public Color GetAttributeColor(string attrName, Color defValue)
 | |
|         {
 | |
|             string value = GetAttribute(attrName);
 | |
|             if (value == null || value.Length == 0)
 | |
|                 return defValue;
 | |
| 
 | |
|             return ToolSet.ConvertFromHtmlColor(value);
 | |
|         }
 | |
| 
 | |
|         public Vector2 GetAttributeVector(string attrName)
 | |
|         {
 | |
|             string value = GetAttribute(attrName);
 | |
|             if (value != null)
 | |
|             {
 | |
|                 string[] arr = value.Split(',');
 | |
|                 return new Vector2(float.Parse(arr[0]), float.Parse(arr[1]));
 | |
|             }
 | |
|             else
 | |
|                 return Vector2.zero;
 | |
|         }
 | |
| 
 | |
|         public void SetAttribute(string attrName, string attrValue)
 | |
|         {
 | |
|             if (_attributes == null)
 | |
|                 _attributes = new Dictionary<string, string>();
 | |
| 
 | |
|             _attributes[attrName] = attrValue;
 | |
|         }
 | |
| 
 | |
|         public void SetAttribute(string attrName, bool attrValue)
 | |
|         {
 | |
|             if (_attributes == null)
 | |
|                 _attributes = new Dictionary<string, string>();
 | |
| 
 | |
|             _attributes[attrName] = attrValue ? "true" : "false";
 | |
|         }
 | |
| 
 | |
|         public void SetAttribute(string attrName, int attrValue)
 | |
|         {
 | |
|             if (_attributes == null)
 | |
|                 _attributes = new Dictionary<string, string>();
 | |
| 
 | |
|             _attributes[attrName] = attrValue.ToString();
 | |
|         }
 | |
| 
 | |
|         public void SetAttribute(string attrName, float attrValue)
 | |
|         {
 | |
|             if (_attributes == null)
 | |
|                 _attributes = new Dictionary<string, string>();
 | |
| 
 | |
|             _attributes[attrName] = string.Format("{0:#.####}", attrValue);
 | |
|         }
 | |
| 
 | |
|         public void RemoveAttribute(string attrName)
 | |
|         {
 | |
|             if (_attributes != null)
 | |
|                 _attributes.Remove(attrName);
 | |
|         }
 | |
| 
 | |
|         public XML GetNode(string selector)
 | |
|         {
 | |
|             if (_children == null)
 | |
|                 return null;
 | |
|             else
 | |
|                 return _children.Find(selector);
 | |
|         }
 | |
| 
 | |
|         public XMLList elements
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 if (_children == null)
 | |
|                     _children = new XMLList();
 | |
|                 return _children;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public XMLList Elements()
 | |
|         {
 | |
|             if (_children == null)
 | |
|                 _children = new XMLList();
 | |
|             return _children;
 | |
|         }
 | |
| 
 | |
|         public XMLList Elements(string selector)
 | |
|         {
 | |
|             if (_children == null)
 | |
|                 _children = new XMLList();
 | |
|             return _children.Filter(selector);
 | |
|         }
 | |
| 
 | |
|         public XMLList.Enumerator GetEnumerator()
 | |
|         {
 | |
|             if (_children == null)
 | |
|                 return new XMLList.Enumerator(null, null);
 | |
|             else
 | |
|                 return new XMLList.Enumerator(_children.rawList, null);
 | |
|         }
 | |
| 
 | |
|         public XMLList.Enumerator GetEnumerator(string selector)
 | |
|         {
 | |
|             if (_children == null)
 | |
|                 return new XMLList.Enumerator(null, selector);
 | |
|             else
 | |
|                 return new XMLList.Enumerator(_children.rawList, selector);
 | |
|         }
 | |
| 
 | |
|         public void AppendChild(XML child)
 | |
|         {
 | |
|             this.elements.Add(child);
 | |
|         }
 | |
| 
 | |
|         public void RemoveChild(XML child)
 | |
|         {
 | |
|             if (_children == null)
 | |
|                 return;
 | |
| 
 | |
|             this._children.rawList.Remove(child);
 | |
|         }
 | |
| 
 | |
|         public void RemoveChildren(string selector)
 | |
|         {
 | |
|             if (_children == null)
 | |
|                 return;
 | |
| 
 | |
|             if (string.IsNullOrEmpty(selector))
 | |
|                 _children.Clear();
 | |
|             else
 | |
|                 _children.RemoveAll(selector);
 | |
|         }
 | |
| 
 | |
|         static Stack<XML> sNodeStack = new Stack<XML>();
 | |
|         public void Parse(string aSource)
 | |
|         {
 | |
|             Reset();
 | |
|             
 | |
|             XML lastOpenNode = null;
 | |
|             sNodeStack.Clear();
 | |
| 
 | |
|             XMLIterator.Begin(aSource);
 | |
|             while (XMLIterator.NextTag())
 | |
|             {
 | |
|                 if (XMLIterator.tagType == XMLTagType.Start || XMLIterator.tagType == XMLTagType.Void)
 | |
|                 {
 | |
|                     XML childNode;
 | |
|                     if (lastOpenNode != null)
 | |
|                         childNode = new XML();
 | |
|                     else
 | |
|                     {
 | |
|                         if (this.name != null)
 | |
|                         {
 | |
|                             Reset();
 | |
|                             throw new Exception("Invalid xml format - no root node.");
 | |
|                         }
 | |
|                         childNode = this;
 | |
|                     }
 | |
| 
 | |
|                     childNode.name = XMLIterator.tagName;
 | |
|                     childNode._attributes = XMLIterator.GetAttributes(childNode._attributes);
 | |
| 
 | |
|                     if (lastOpenNode != null)
 | |
|                     {
 | |
|                         if (XMLIterator.tagType != XMLTagType.Void)
 | |
|                             sNodeStack.Push(lastOpenNode);
 | |
|                         if (lastOpenNode._children == null)
 | |
|                             lastOpenNode._children = new XMLList();
 | |
|                         lastOpenNode._children.Add(childNode);
 | |
|                     }
 | |
|                     if (XMLIterator.tagType != XMLTagType.Void)
 | |
|                         lastOpenNode = childNode;
 | |
|                 }
 | |
|                 else if (XMLIterator.tagType == XMLTagType.End)
 | |
|                 {
 | |
|                     if (lastOpenNode == null || lastOpenNode.name != XMLIterator.tagName)
 | |
|                     {
 | |
|                         Reset();
 | |
|                         throw new Exception("Invalid xml format - <" + XMLIterator.tagName + "> dismatched.");
 | |
|                     }
 | |
| 
 | |
|                     if (lastOpenNode._children == null || lastOpenNode._children.Count == 0)
 | |
|                     {
 | |
|                         lastOpenNode.text = XMLIterator.GetText();
 | |
|                     }
 | |
| 
 | |
|                     if (sNodeStack.Count > 0)
 | |
|                         lastOpenNode = sNodeStack.Pop();
 | |
|                     else
 | |
|                         lastOpenNode = null;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public void Reset()
 | |
|         {
 | |
|             if (_attributes != null)
 | |
|                 _attributes.Clear();
 | |
|             if (_children != null)
 | |
|                 _children.Clear();
 | |
|             this.text = null;
 | |
|         }
 | |
| 
 | |
|         public string ToXMLString(bool includeHeader)
 | |
|         {
 | |
|             StringBuilder sb = new StringBuilder();
 | |
|             if (includeHeader)
 | |
|                 sb.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
 | |
|             ToXMLString(sb, 0);
 | |
|             return sb.ToString();
 | |
|         }
 | |
| 
 | |
|         void ToXMLString(StringBuilder sb, int tabs)
 | |
|         {
 | |
|             if (tabs > 0)
 | |
|                 sb.Append(' ', tabs * 2);
 | |
| 
 | |
|             if (name == "!")
 | |
|             {
 | |
|                 sb.Append("<!--");
 | |
|                 if (text != null)
 | |
|                 {
 | |
|                     int c = sb.Length;
 | |
|                     sb.Append(text);
 | |
|                     XMLUtils.EncodeString(sb, c);
 | |
|                 }
 | |
|                 sb.Append("-->");
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             sb.Append('<').Append(name);
 | |
|             if (_attributes != null)
 | |
|             {
 | |
|                 foreach (KeyValuePair<string, string> kv in _attributes)
 | |
|                 {
 | |
|                     sb.Append(' ');
 | |
|                     sb.Append(kv.Key).Append('=').Append('\"');
 | |
|                     int c = sb.Length;
 | |
|                     sb.Append(kv.Value);
 | |
|                     XMLUtils.EncodeString(sb, c, true);
 | |
|                     sb.Append("\"");
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             int numChildren = _children != null ? _children.Count : 0;
 | |
| 
 | |
|             if (string.IsNullOrEmpty(text) && numChildren == 0)
 | |
|                 sb.Append("/>");
 | |
|             else
 | |
|             {
 | |
|                 sb.Append('>');
 | |
| 
 | |
|                 if (!string.IsNullOrEmpty(text))
 | |
|                 {
 | |
|                     int c = sb.Length;
 | |
|                     sb.Append(text);
 | |
|                     XMLUtils.EncodeString(sb, c);
 | |
|                 }
 | |
| 
 | |
|                 if (numChildren > 0)
 | |
|                 {
 | |
|                     sb.Append('\n');
 | |
|                     int ctabs = tabs + 1;
 | |
|                     for (int i = 0; i < numChildren; i++)
 | |
|                     {
 | |
|                         _children[i].ToXMLString(sb, ctabs);
 | |
|                         sb.Append('\n');
 | |
|                     }
 | |
| 
 | |
|                     if (tabs > 0)
 | |
|                         sb.Append(' ', tabs * 2);
 | |
|                 }
 | |
| 
 | |
|                 sb.Append("</").Append(name).Append(">");
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| } |