204 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			204 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Text;
 | |
| using System.Runtime.Serialization;
 | |
| using System.Xml;
 | |
| 
 | |
| namespace VEPROMS.CSLA.Library
 | |
| {
 | |
| 	public delegate string XMLPropertiesEvent(object sender, XMLPropertiesArgs args);
 | |
| 	[Serializable()]
 | |
| 	public class XMLProperties
 | |
| 	{
 | |
| 		#region Events
 | |
| 		public event XMLPropertiesEvent LookInAncestor;
 | |
| 		private string OnLookInAncestor(object sender, XMLPropertiesArgs args)
 | |
| 		{
 | |
| 			if (LookInAncestor != null) return LookInAncestor(sender, args);
 | |
| 			return string.Empty;
 | |
| 		}
 | |
| 		#endregion
 | |
| 		private bool _AncestorLookup=false;
 | |
| 
 | |
| 		public bool AncestorLookup
 | |
| 		{
 | |
| 			get { return _AncestorLookup; }
 | |
| 			set { _AncestorLookup = value; }
 | |
| 		}
 | |
| 
 | |
| 		#region Constructors
 | |
| 		public XMLProperties()
 | |
| 		{
 | |
| 			_XmlContents = new XmlDocument();
 | |
| 			_XmlContents.LoadXml("<Config/>");
 | |
| 		}
 | |
| 		public XMLProperties(string xml)
 | |
| 		{
 | |
| 			_XmlContents = new XmlDocument();
 | |
| 			_XmlContents.LoadXml(xml);
 | |
| 		}
 | |
| 		#endregion
 | |
| 		#region BusinessMethods
 | |
| 		[NonSerialized]
 | |
| 		private bool _ParentLookup=false;
 | |
| 		public bool ParentLookup
 | |
| 		{
 | |
| 			get { return _ParentLookup; }
 | |
| 			set { _ParentLookup = value; }
 | |
| 		}
 | |
| 		[NonSerialized]
 | |
| 		XmlDocument _XmlContents;
 | |
| 		public XmlDocument XmlContents
 | |
| 		{
 | |
| 			get { return _XmlContents; }
 | |
| 		}
 | |
| 		private XmlNode GetGroup(string group)
 | |
| 		{
 | |
| 			XmlNodeList xl = _XmlContents.DocumentElement.SelectNodes(string.Format("//{0}", group));
 | |
| 			if(xl.Count == 0 && System.Text.RegularExpressions.Regex.IsMatch(group,"^[A-Za-z0-9]+$"))
 | |
| 				xl = _XmlContents.DocumentElement.SelectNodes(
 | |
| 					string.Format("//*[translate(local-name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='{0}']", group.ToLower()));
 | |
| 			switch (xl.Count)
 | |
| 			{
 | |
| 				case 0: // No nodes found
 | |
| 					return null;
 | |
| 				case 1: // Found the node
 | |
| 					XmlNode xn = xl[0];
 | |
| 					if (xn.GetType() == typeof(XmlElement)) return xn;
 | |
| 					throw new XmlPropertiesException("Retrieved {0} while looking for XmlElement //{1}", xn.GetType().ToString(), group);
 | |
| 				default: // Found more than 1 node
 | |
| 					throw new XmlPropertiesException("Found more than one node //{0}", group);
 | |
| 			}
 | |
| 		}
 | |
| 		private XmlAttribute GetItem(XmlNode xx, string item)
 | |
| 		{
 | |
| 			//XmlNodeList xl = xx.SelectNodes(string.Format("@{0}", item));
 | |
| 			XmlNodeList xl = xx.SelectNodes(
 | |
| 				string.Format("@*[translate(local-name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='{0}']", item.ToLower()));
 | |
| 			switch (xl.Count)
 | |
| 			{
 | |
| 				case 0: // No nodes found
 | |
| 					return null;
 | |
| 				case 1: // Found the node
 | |
| 					XmlNode xn = xl[0];
 | |
| 					if (xn.GetType() == typeof(XmlAttribute)) return (XmlAttribute)xn;
 | |
| 					throw new XmlPropertiesException("Retrieved {0} while looking for XmlAttribute @{1}", xn.GetType().ToString(), item);
 | |
| 				default: // Found more than 1 node
 | |
| 					throw new XmlPropertiesException("Found more than one node @{0}", item);
 | |
| 			}
 | |
| 		}
 | |
| 		public string ParentValue(string group, string item)
 | |
| 		{
 | |
| 			return OnLookInAncestor(this, new XMLPropertiesArgs(group, item, true));
 | |
| 		}
 | |
| 		public string this[string group, string item]
 | |
| 		{
 | |
| 			get
 | |
| 			{
 | |
| 				if (_ParentLookup) 
 | |
| 					return OnLookInAncestor(this, new XMLPropertiesArgs(group, item, AncestorLookup));
 | |
| 				XmlNode xn = GetGroup(group);
 | |
| 				if (xn == null) return OnLookInAncestor(this, new XMLPropertiesArgs(group, item, AncestorLookup));
 | |
| 				XmlNode xa = GetItem(xn, item);
 | |
| 				if (xa == null) return OnLookInAncestor(this, new XMLPropertiesArgs(group, item, AncestorLookup));
 | |
| 				return xa.InnerText;
 | |
| 			}
 | |
| 			set
 | |
| 			{
 | |
| 				if (value == null) value = string.Empty;
 | |
| 				XmlNode xn = GetGroup(group);
 | |
| 				if (xn == null)
 | |
| 				{
 | |
| 					if (value != string.Empty)// Add Group and Item
 | |
| 					{
 | |
| 						xn = _XmlContents.DocumentElement.AppendChild(_XmlContents.CreateElement(group));
 | |
| 						XmlAttribute xa = xn.Attributes.Append(_XmlContents.CreateAttribute(item));
 | |
| 						xa.Value = value;
 | |
| 					}
 | |
| 				}
 | |
| 				else
 | |
| 				{
 | |
| 					XmlAttribute xa = GetItem(xn, item);
 | |
| 					if (xa == null)
 | |
| 					{
 | |
| 						if (value != string.Empty) // Add Item
 | |
| 						{
 | |
| 							xa = xn.Attributes.Append(_XmlContents.CreateAttribute(item));
 | |
| 							xa.Value = value;
 | |
| 						}
 | |
| 					}
 | |
| 					else
 | |
| 					{
 | |
| 						if (value != string.Empty) // Add Item
 | |
| 						{
 | |
| 							xa.Value = value;
 | |
| 						}
 | |
| 						else
 | |
| 						{
 | |
| 							xn.Attributes.Remove(xa);
 | |
| 							if (xn.Attributes.Count == 0)
 | |
| 								_XmlContents.DocumentElement.RemoveChild(xn);
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 		public override string ToString()
 | |
| 		{
 | |
| 			if (XmlContents == null) return null;
 | |
| 			return XmlContents.OuterXml;
 | |
| 		}
 | |
| 		#endregion
 | |
| 		#region XmlPropertiesException
 | |
| 		public class XmlPropertiesException : Exception
 | |
| 		{
 | |
| 			public XmlPropertiesException() : base() { ;}
 | |
| 			public XmlPropertiesException(string message) : base(message) { ;}
 | |
| 			public XmlPropertiesException(string messageFormat,params  object [] args) : base(string.Format(messageFormat,args)) { ;}
 | |
| 			public XmlPropertiesException(SerializationInfo info, StreamingContext context) : base(info, context) { ;}
 | |
| 			public XmlPropertiesException(string message,Exception innerException) : base(message, innerException) { ;}
 | |
| 		}
 | |
| 		#endregion
 | |
| 	}
 | |
| 	public partial class XMLPropertiesArgs
 | |
| 	{
 | |
| 		#region Business Methods
 | |
| 		private string _Group;
 | |
| 		public string Group
 | |
| 		{
 | |
| 			get { return _Group; }
 | |
| 			set { _Group = value; }
 | |
| 		}
 | |
| 		private string _Item;
 | |
| 		public string Item
 | |
| 		{
 | |
| 			get { return _Item; }
 | |
| 			set { _Item = value; }
 | |
| 		}
 | |
| 		private bool _AncestorLookup;
 | |
| 
 | |
| 		public bool AncestorLookup
 | |
| 		{
 | |
| 			get { return _AncestorLookup; }
 | |
| 			set { _AncestorLookup = value; }
 | |
| 		}
 | |
| 
 | |
| 		#endregion
 | |
| 		#region Factory Methods
 | |
| 		private XMLPropertiesArgs() { ;}
 | |
| 		public XMLPropertiesArgs(string group, string item)
 | |
| 		{
 | |
| 			_Group=group;
 | |
| 			_Item=item;
 | |
| 			_AncestorLookup = false;
 | |
| 		}
 | |
| 		public XMLPropertiesArgs(string group, string item, bool ancestorLookup)
 | |
| 		{
 | |
| 			_Group = group;
 | |
| 			_Item = item;
 | |
| 			_AncestorLookup = ancestorLookup;
 | |
| 		}
 | |
| 		#endregion
 | |
| 	}
 | |
| }
 | 
