XmlCustomFormatter.cs 5.9 KB

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