XmlConvert.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. //
  2. // System.Xml.XmlConvert
  3. //
  4. // Authors:
  5. // Dwivedi, Ajay kumar ([email protected])
  6. // Gonzalo Paniagua Javier ([email protected])
  7. //
  8. // (C) 2002 Ximian, Inc (http://www.ximian.com)
  9. //
  10. using System;
  11. using System.Text;
  12. using System.Globalization;
  13. namespace System.Xml {
  14. public class XmlConvert {
  15. static string encodedColon = "_x003A_";
  16. public XmlConvert()
  17. {}
  18. private static string TryDecoding (string s)
  19. {
  20. if (s == null || s.Length < 6)
  21. return s;
  22. char c = '\uFFFF';
  23. try {
  24. c = (char) Int32.Parse (s.Substring (1, 4), NumberStyles.HexNumber);
  25. } catch {
  26. return s [0] + DecodeName (s.Substring (1));
  27. }
  28. if (s.Length == 6)
  29. return c.ToString ();
  30. return c + DecodeName (s.Substring (6));
  31. }
  32. public static string DecodeName (string name)
  33. {
  34. if (name == null || name.Length == 0)
  35. return name;
  36. int pos = name.IndexOf ('_');
  37. if (pos == -1 || pos + 6 >= name.Length)
  38. return name;
  39. if (Char.ToUpper (name [pos + 1]) != 'X' || name [pos + 6] != '_')
  40. return name [0] + DecodeName (name.Substring (1));
  41. return name.Substring (0, pos) + TryDecoding (name.Substring (pos + 1));
  42. }
  43. public static string EncodeLocalName (string name)
  44. {
  45. string encoded = EncodeName (name);
  46. int pos = encoded.IndexOf (':');
  47. if (pos == -1)
  48. return encoded;
  49. return encoded.Replace (":", encodedColon);
  50. }
  51. private static bool IsInvalid (char c, bool firstOnlyLetter)
  52. {
  53. if (c == ':') // Special case. allowed in EncodeName, but encoded in EncodeLocalName
  54. return false;
  55. if (firstOnlyLetter && !Char.IsLetter (c) && c != '_')
  56. return false;
  57. return !Char.IsLetterOrDigit (c);
  58. }
  59. private static string EncodeName (string name, bool nmtoken)
  60. {
  61. StringBuilder sb = new StringBuilder ();
  62. int length = name.Length;
  63. for (int i = 0; i < length; i++) {
  64. char c = name [i];
  65. if (c != '_' || i + 6 >= length) {
  66. bool firstOnlyLetter = (i == 0 && !nmtoken);
  67. if (IsInvalid (c, firstOnlyLetter)) {
  68. sb.AppendFormat ("_x{0:X4}_", (int) c);
  69. continue;
  70. }
  71. } else {
  72. if (Char.ToUpper (name [i + 1]) == 'X' && name [i + 6] == '_') {
  73. string decoded = TryDecoding (name.Substring (i + 1, 6));
  74. if (decoded.Length == 1) {
  75. sb.AppendFormat ("_x{0:X4}_", (int) c);
  76. continue;
  77. }
  78. }
  79. }
  80. sb.Append (c);
  81. }
  82. return sb.ToString ();
  83. }
  84. public static string EncodeName (string name)
  85. {
  86. return EncodeName (name, false);
  87. }
  88. public static string EncodeNmToken(string name)
  89. {
  90. return EncodeName (name, true);
  91. }
  92. // {true, false, 1, 0}
  93. public static bool ToBoolean(string s)
  94. {
  95. s = s.Trim();
  96. switch(s)
  97. {
  98. case "1":
  99. return true;
  100. case "true":
  101. return true;
  102. case "0":
  103. return false;
  104. case "false":
  105. return false;
  106. default:
  107. throw new FormatException(s + " is not a valid boolean value");
  108. }
  109. }
  110. public static byte ToByte(string s)
  111. {
  112. return Byte.Parse(s, CultureInfo.InvariantCulture);
  113. }
  114. public static char ToChar(string s)
  115. {
  116. return Char.Parse(s);
  117. }
  118. public static DateTime ToDateTime(string s)
  119. {
  120. return DateTime.Parse(s);
  121. }
  122. public static DateTime ToDateTime(string s, string format)
  123. {
  124. DateTimeFormatInfo d = new DateTimeFormatInfo();
  125. d.FullDateTimePattern = format;
  126. return DateTime.Parse(s, d);
  127. }
  128. public static DateTime ToDateTime(string s, string[] formats)
  129. {
  130. DateTimeStyles style = DateTimeStyles.AllowLeadingWhite |
  131. DateTimeStyles.AllowTrailingWhite;
  132. return DateTime.ParseExact (s, formats, DateTimeFormatInfo.InvariantInfo, style);
  133. }
  134. public static Decimal ToDecimal(string s)
  135. {
  136. return Decimal.Parse(s, CultureInfo.InvariantCulture);
  137. }
  138. public static double ToDouble(string s)
  139. {
  140. return Double.Parse(s, CultureInfo.InvariantCulture);
  141. }
  142. public static Guid ToGuid(string s)
  143. {
  144. return new Guid(s);
  145. }
  146. public static short ToInt16(string s)
  147. {
  148. return Int16.Parse(s, CultureInfo.InvariantCulture);
  149. }
  150. public static int ToInt32(string s)
  151. {
  152. return Int32.Parse(s, CultureInfo.InvariantCulture);
  153. }
  154. public static long ToInt64(string s)
  155. {
  156. return Int64.Parse(s, CultureInfo.InvariantCulture);
  157. }
  158. [CLSCompliant (false)]
  159. public static SByte ToSByte(string s)
  160. {
  161. return SByte.Parse(s, CultureInfo.InvariantCulture);
  162. }
  163. public static float ToSingle(string s)
  164. {
  165. return Single.Parse(s, CultureInfo.InvariantCulture);
  166. }
  167. public static string ToString(Guid value)
  168. {
  169. return value.ToString("D",CultureInfo.InvariantCulture);
  170. }
  171. public static string ToString(int value)
  172. {
  173. return value.ToString(CultureInfo.InvariantCulture);
  174. }
  175. public static string ToString(short value)
  176. {
  177. return value.ToString(CultureInfo.InvariantCulture);
  178. }
  179. public static string ToString(byte value)
  180. {
  181. return value.ToString(CultureInfo.InvariantCulture);
  182. }
  183. public static string ToString(long value)
  184. {
  185. return value.ToString(CultureInfo.InvariantCulture);
  186. }
  187. public static string ToString(char value)
  188. {
  189. return value.ToString(CultureInfo.InvariantCulture);
  190. }
  191. public static string ToString(bool value)
  192. {
  193. return value.ToString(CultureInfo.InvariantCulture);
  194. }
  195. [CLSCompliant (false)]
  196. public static string ToString(SByte value)
  197. {
  198. return value.ToString(CultureInfo.InvariantCulture);
  199. }
  200. public static string ToString(Decimal value)
  201. {
  202. return value.ToString(CultureInfo.InvariantCulture);
  203. }
  204. [CLSCompliant (false)]
  205. public static string ToString(UInt64 value)
  206. {
  207. return value.ToString(CultureInfo.InvariantCulture);
  208. }
  209. public static string ToString(TimeSpan value)
  210. {
  211. return value.ToString();
  212. }
  213. public static string ToString(double value)
  214. {
  215. return value.ToString(CultureInfo.InvariantCulture);
  216. }
  217. public static string ToString(float value)
  218. {
  219. return value.ToString(CultureInfo.InvariantCulture);
  220. }
  221. [CLSCompliant (false)]
  222. public static string ToString(UInt32 value)
  223. {
  224. return value.ToString(CultureInfo.InvariantCulture);
  225. }
  226. [CLSCompliant (false)]
  227. public static string ToString(UInt16 value)
  228. {
  229. return value.ToString(CultureInfo.InvariantCulture);
  230. }
  231. public static string ToString(DateTime value)
  232. {
  233. return value.ToString(CultureInfo.InvariantCulture);
  234. }
  235. public static string ToString(DateTime value, string format)
  236. {
  237. return value.ToString(format, CultureInfo.InvariantCulture);
  238. }
  239. public static TimeSpan ToTimeSpan(string s)
  240. {
  241. return TimeSpan.Parse(s);
  242. }
  243. [CLSCompliant (false)]
  244. public static UInt16 ToUInt16(string s)
  245. {
  246. return UInt16.Parse(s, CultureInfo.InvariantCulture);
  247. }
  248. [CLSCompliant (false)]
  249. public static UInt32 ToUInt32(string s)
  250. {
  251. return UInt32.Parse(s, CultureInfo.InvariantCulture);
  252. }
  253. [CLSCompliant (false)]
  254. public static UInt64 ToUInt64(string s)
  255. {
  256. return UInt64.Parse(s, CultureInfo.InvariantCulture);
  257. }
  258. public static string VerifyName(string name)
  259. {
  260. Exception innerEx;
  261. if(name == null)
  262. throw new ArgumentNullException("name");
  263. if(XmlConstructs.IsValidName(name, out innerEx))
  264. return name;
  265. throw new XmlException("'"+name+"' is not a valid XML Name",null);
  266. }
  267. public static string VerifyNCName(string ncname)
  268. {
  269. Exception innerEx;
  270. if(ncname == null)
  271. throw new ArgumentNullException("ncname");
  272. if(XmlConstructs.IsValidName(ncname, out innerEx))
  273. return ncname;
  274. throw new XmlException("'"+ncname+"' is not a valid XML NCName",innerEx);
  275. }
  276. }
  277. }