XmlCustomFormatter.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. //
  2. // System.Xml.Serialization.XmlCustomFormatter.cs
  3. //
  4. // Author:
  5. // Tim Coleman ([email protected])
  6. // Lluis Sanchez Gual ([email protected])
  7. //
  8. // Copyright (C) Tim Coleman, 2002
  9. //
  10. using System;
  11. using System.Collections;
  12. using System.Text;
  13. using System.Xml;
  14. namespace System.Xml.Serialization {
  15. internal class XmlCustomFormatter {
  16. #region Methods
  17. internal static string FromByteArrayBase64 (byte[] value)
  18. {
  19. return Convert.ToBase64String(value);
  20. }
  21. internal static string FromByteArrayHex (byte[] value)
  22. {
  23. if (value == null) return null;
  24. StringBuilder output = new StringBuilder ();
  25. foreach (byte val in value)
  26. output.Append (val.ToString ("X2"));
  27. return output.ToString ();
  28. }
  29. internal static string FromChar (char value)
  30. {
  31. return ((int) value).ToString ();
  32. }
  33. internal static string FromDate (DateTime value)
  34. {
  35. return XmlConvert.ToString (value, "yyyy-MM-dd");
  36. }
  37. internal static string FromDateTime (DateTime value)
  38. {
  39. return XmlConvert.ToString (value, "yyyy-MM-ddTHH:mm:ss.fffffffzzz");
  40. }
  41. internal static string FromTime (DateTime value)
  42. {
  43. return XmlConvert.ToString (value, "HH:mm:ss.fffffffzzz");
  44. }
  45. internal static string FromEnum (long value, string[] values, long[] ids)
  46. {
  47. int length = ids.Length;
  48. for (int i = 0; i < length; i ++) {
  49. if (ids[i] == value)
  50. if (i >= values.Length)
  51. return String.Empty;
  52. else
  53. return values[i].ToString ();
  54. }
  55. return String.Empty;
  56. }
  57. internal static string FromXmlName (string name)
  58. {
  59. return XmlConvert.EncodeName (name);
  60. }
  61. internal static string FromXmlNCName (string ncName)
  62. {
  63. return XmlConvert.EncodeLocalName (ncName);
  64. }
  65. internal static string FromXmlNmToken (string nmToken)
  66. {
  67. return XmlConvert.EncodeNmToken (nmToken);
  68. }
  69. internal static string FromXmlNmTokens (string nmTokens)
  70. {
  71. string [] tokens = nmTokens.Split (' ');
  72. for (int i=0; i<tokens.Length; i++)
  73. tokens [i] = FromXmlNmToken (tokens [i]);
  74. return String.Join (" ", tokens);
  75. }
  76. internal static byte[] ToByteArrayBase64 (string value)
  77. {
  78. return Convert.FromBase64String(value);
  79. }
  80. internal static char ToChar (string value)
  81. {
  82. return (char) XmlConvert.ToUInt16 (value);
  83. }
  84. internal static DateTime ToDate (string value)
  85. {
  86. return ToDateTime (value);
  87. }
  88. internal static DateTime ToDateTime (string value)
  89. {
  90. return XmlConvert.ToDateTime (value);
  91. }
  92. internal static DateTime ToTime (string value)
  93. {
  94. return ToDateTime (value);
  95. }
  96. internal static long ToEnum (string value, Hashtable values, string typeName, bool validate)
  97. {
  98. // Assuming that h contains map from value to Enumerated Name
  99. /*
  100. You can try :
  101. return ToEnum ("Element", h, "XmlNodeType");
  102. where:
  103. (1) no keys and values for h.
  104. (2) string keys and Enum, Type, long, string value.
  105. */
  106. string memberName = (string) values [value];
  107. if (memberName == null)
  108. throw new InvalidOperationException (String.Format ("{0} is not a valid member of type {1}", value, typeName));
  109. return (long) Enum.Parse (Type.GetType (typeName), memberName);
  110. }
  111. internal static string ToXmlName (string value)
  112. {
  113. return XmlConvert.DecodeName (value);
  114. }
  115. internal static string ToXmlNCName (string value)
  116. {
  117. return ToXmlName (value);
  118. }
  119. internal static string ToXmlNmToken (string value)
  120. {
  121. return ToXmlName (value);
  122. }
  123. internal static string ToXmlNmTokens (string value)
  124. {
  125. return ToXmlName (value);
  126. }
  127. internal static string ToXmlString (object value)
  128. {
  129. if (value == null) return null;
  130. switch (Type.GetTypeCode(value.GetType()))
  131. {
  132. case TypeCode.Boolean: return XmlConvert.ToString ((bool)value);
  133. case TypeCode.Byte: return XmlConvert.ToString ((byte)value);
  134. case TypeCode.Char: return XmlConvert.ToString ((int)(char)value);
  135. case TypeCode.DateTime: return XmlConvert.ToString ((DateTime)value);
  136. case TypeCode.Decimal: return XmlConvert.ToString ((decimal)value);
  137. case TypeCode.Double: return XmlConvert.ToString ((double)value);
  138. case TypeCode.Int16: return XmlConvert.ToString ((Int16)value);
  139. case TypeCode.Int32: return XmlConvert.ToString ((Int32)value);
  140. case TypeCode.Int64: return XmlConvert.ToString ((Int64)value);
  141. case TypeCode.SByte: return XmlConvert.ToString ((sbyte)value);
  142. case TypeCode.Single: return XmlConvert.ToString ((Single)value);
  143. case TypeCode.UInt16: return XmlConvert.ToString ((UInt16)value);
  144. case TypeCode.UInt32: return XmlConvert.ToString ((UInt32)value);
  145. case TypeCode.UInt64: return XmlConvert.ToString ((UInt64)value);
  146. }
  147. if (value.GetType() == typeof(TimeSpan)) return XmlConvert.ToString ((TimeSpan)value);
  148. else if (value.GetType() == typeof (Guid)) return XmlConvert.ToString ((Guid)value);
  149. else if (value.GetType() == typeof(byte[])) return Convert.ToBase64String ((byte[])value);
  150. return value.ToString ();
  151. }
  152. internal static object FromXmlString (Type type, string value)
  153. {
  154. if (value == null) return null;
  155. switch (Type.GetTypeCode (type))
  156. {
  157. case TypeCode.Boolean: return XmlConvert.ToBoolean (value);
  158. case TypeCode.Byte: return XmlConvert.ToByte (value);
  159. case TypeCode.Char: return (char)XmlConvert.ToInt32 (value);
  160. case TypeCode.DateTime: return XmlConvert.ToDateTime (value);
  161. case TypeCode.Decimal: return XmlConvert.ToDecimal (value);
  162. case TypeCode.Double: return XmlConvert.ToDouble (value);
  163. case TypeCode.Int16: return XmlConvert.ToInt16 (value);
  164. case TypeCode.Int32: return XmlConvert.ToInt32 (value);
  165. case TypeCode.Int64: return XmlConvert.ToInt64 (value);
  166. case TypeCode.SByte: return XmlConvert.ToSByte (value);
  167. case TypeCode.Single: return XmlConvert.ToSingle (value);
  168. case TypeCode.UInt16: return XmlConvert.ToUInt16 (value);
  169. case TypeCode.UInt32: return XmlConvert.ToUInt32 (value);
  170. case TypeCode.UInt64: return XmlConvert.ToUInt64 (value);
  171. }
  172. if (type == typeof (TimeSpan)) return XmlConvert.ToTimeSpan (value);
  173. else if (type == typeof(Guid)) return XmlConvert.ToGuid (value);
  174. else if (type == typeof(byte[])) return Convert.FromBase64String (value);
  175. else return Convert.ChangeType (value, type);
  176. }
  177. #endregion // Methods
  178. }
  179. }