XmlConvert.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. //
  2. // System.Xml.XmlConvert
  3. //
  4. // Authors:
  5. // Dwivedi, Ajay kumar ([email protected])
  6. // Gonzalo Paniagua Javier ([email protected])
  7. // Alan Tam Siu Lung ([email protected])
  8. // Atsushi Enomoto ([email protected])
  9. //
  10. // (C) 2002 Ximian, Inc (http://www.ximian.com)
  11. //
  12. using System;
  13. using System.Text;
  14. using System.Globalization;
  15. namespace System.Xml {
  16. public class XmlConvert {
  17. static string encodedColon = "_x003A_";
  18. public XmlConvert()
  19. {}
  20. private static string TryDecoding (string s)
  21. {
  22. if (s == null || s.Length < 6)
  23. return s;
  24. char c = '\uFFFF';
  25. try {
  26. c = (char) Int32.Parse (s.Substring (1, 4), NumberStyles.HexNumber);
  27. } catch {
  28. return s [0] + DecodeName (s.Substring (1));
  29. }
  30. if (s.Length == 6)
  31. return c.ToString ();
  32. return c + DecodeName (s.Substring (6));
  33. }
  34. public static string DecodeName (string name)
  35. {
  36. if (name == null || name.Length == 0)
  37. return name;
  38. int pos = name.IndexOf ('_');
  39. if (pos == -1 || pos + 6 >= name.Length)
  40. return name;
  41. if (Char.ToUpper (name [pos + 1]) != 'X' || name [pos + 6] != '_')
  42. return name [0] + DecodeName (name.Substring (1));
  43. return name.Substring (0, pos) + TryDecoding (name.Substring (pos + 1));
  44. }
  45. public static string EncodeLocalName (string name)
  46. {
  47. string encoded = EncodeName (name);
  48. int pos = encoded.IndexOf (':');
  49. if (pos == -1)
  50. return encoded;
  51. return encoded.Replace (":", encodedColon);
  52. }
  53. internal static bool IsInvalid (char c, bool firstOnlyLetter)
  54. {
  55. if (c == ':') // Special case. allowed in EncodeName, but encoded in EncodeLocalName
  56. return false;
  57. if (firstOnlyLetter)
  58. return !XmlConstructs.IsNameStart (c);
  59. else
  60. return !XmlConstructs.IsName (c);
  61. }
  62. private static string EncodeName (string name, bool nmtoken)
  63. {
  64. StringBuilder sb = new StringBuilder ();
  65. int length = name.Length;
  66. for (int i = 0; i < length; i++) {
  67. char c = name [i];
  68. if (IsInvalid (c, i == 0 && !nmtoken))
  69. sb.AppendFormat ("_x{0:X4}_", (int) c);
  70. else if (c == '_' && i + 6 < length && name [i+1] == 'x' && name [i + 6] == '_')
  71. sb.Append ("_x005F_");
  72. else
  73. sb.Append (c);
  74. }
  75. return sb.ToString ();
  76. }
  77. public static string EncodeName (string name)
  78. {
  79. return EncodeName (name, false);
  80. }
  81. public static string EncodeNmToken(string name)
  82. {
  83. return EncodeName (name, true);
  84. }
  85. // {true, false, 1, 0}
  86. public static bool ToBoolean(string s)
  87. {
  88. s = s.Trim();
  89. switch(s)
  90. {
  91. case "1":
  92. return true;
  93. case "true":
  94. return true;
  95. case "0":
  96. return false;
  97. case "false":
  98. return false;
  99. default:
  100. throw new FormatException(s + " is not a valid boolean value");
  101. }
  102. }
  103. public static byte ToByte(string s)
  104. {
  105. return Byte.Parse(s, CultureInfo.InvariantCulture);
  106. }
  107. public static char ToChar(string s)
  108. {
  109. return Char.Parse(s);
  110. }
  111. public static DateTime ToDateTime(string s)
  112. {
  113. return ToDateTime(s, new string[] {
  114. // dateTime
  115. "yyyy-MM-ddTHH:mm:ss",
  116. "yyyy-MM-ddTHH:mm:ss.f",
  117. "yyyy-MM-ddTHH:mm:ss.ff",
  118. "yyyy-MM-ddTHH:mm:ss.fff",
  119. "yyyy-MM-ddTHH:mm:ss.ffff",
  120. "yyyy-MM-ddTHH:mm:ss.fffff",
  121. "yyyy-MM-ddTHH:mm:ss.ffffff",
  122. "yyyy-MM-ddTHH:mm:ss.fffffff",
  123. "yyyy-MM-ddTHH:mm:sszzz",
  124. "yyyy-MM-ddTHH:mm:ss.fzzz",
  125. "yyyy-MM-ddTHH:mm:ss.ffzzz",
  126. "yyyy-MM-ddTHH:mm:ss.fffzzz",
  127. "yyyy-MM-ddTHH:mm:ss.ffffzzz",
  128. "yyyy-MM-ddTHH:mm:ss.fffffzzz",
  129. "yyyy-MM-ddTHH:mm:ss.ffffffzzz",
  130. "yyyy-MM-ddTHH:mm:ss.fffffffzzz",
  131. "yyyy-MM-ddTHH:mm:ssZ",
  132. "yyyy-MM-ddTHH:mm:ss.fZ",
  133. "yyyy-MM-ddTHH:mm:ss.ffZ",
  134. "yyyy-MM-ddTHH:mm:ss.fffZ",
  135. "yyyy-MM-ddTHH:mm:ss.ffffZ",
  136. "yyyy-MM-ddTHH:mm:ss.fffffZ",
  137. "yyyy-MM-ddTHH:mm:ss.ffffffZ",
  138. "yyyy-MM-ddTHH:mm:ss.fffffffZ",
  139. // time
  140. "HH:mm:ss",
  141. "HH:mm:ss.f",
  142. "HH:mm:ss.ff",
  143. "HH:mm:ss.fff",
  144. "HH:mm:ss.ffff",
  145. "HH:mm:ss.fffff",
  146. "HH:mm:ss.ffffff",
  147. "HH:mm:ss.fffffff",
  148. "HH:mm:sszzz",
  149. "HH:mm:ss.fzzz",
  150. "HH:mm:ss.ffzzz",
  151. "HH:mm:ss.fffzzz",
  152. "HH:mm:ss.ffffzzz",
  153. "HH:mm:ss.fffffzzz",
  154. "HH:mm:ss.ffffffzzz",
  155. "HH:mm:ss.fffffffzzz",
  156. "HH:mm:ssZ",
  157. "HH:mm:ss.fZ",
  158. "HH:mm:ss.ffZ",
  159. "HH:mm:ss.fffZ",
  160. "HH:mm:ss.ffffZ",
  161. "HH:mm:ss.fffffZ",
  162. "HH:mm:ss.ffffffZ",
  163. "HH:mm:ss.fffffffZ",
  164. // date
  165. "yyyy-MM-dd",
  166. "yyyy-MM-ddzzz",
  167. "yyyy-MM-ddZ",
  168. // gYearMonth
  169. "yyyy-MM",
  170. "yyyy-MMzzz",
  171. "yyyy-MMZ",
  172. // gYear
  173. "yyyy",
  174. "yyyyzzz",
  175. "yyyyZ",
  176. // gMonthDay
  177. "--MM-dd",
  178. "--MM-ddzzz",
  179. "--MM-ddZ",
  180. // gDay
  181. "---dd",
  182. "---ddzzz",
  183. "---ddZ",
  184. });
  185. }
  186. public static DateTime ToDateTime(string s, string format)
  187. {
  188. DateTimeFormatInfo d = new DateTimeFormatInfo();
  189. d.FullDateTimePattern = format;
  190. return DateTime.Parse(s, d);
  191. }
  192. public static DateTime ToDateTime(string s, string[] formats)
  193. {
  194. DateTimeStyles style = DateTimeStyles.AllowLeadingWhite |
  195. DateTimeStyles.AllowTrailingWhite;
  196. return DateTime.ParseExact (s, formats, DateTimeFormatInfo.InvariantInfo, style);
  197. }
  198. public static Decimal ToDecimal(string s)
  199. {
  200. return Decimal.Parse(s, CultureInfo.InvariantCulture);
  201. }
  202. public static double ToDouble(string s)
  203. {
  204. if (s == "INF") return System.Double.PositiveInfinity;
  205. if (s == "-INF") return System.Double.NegativeInfinity;
  206. if (s == "NaN") return System.Double.NaN;
  207. return Double.Parse(s, CultureInfo.InvariantCulture);
  208. }
  209. public static Guid ToGuid(string s)
  210. {
  211. return new Guid(s);
  212. }
  213. public static short ToInt16(string s)
  214. {
  215. return Int16.Parse(s, CultureInfo.InvariantCulture);
  216. }
  217. public static int ToInt32(string s)
  218. {
  219. return Int32.Parse(s, CultureInfo.InvariantCulture);
  220. }
  221. public static long ToInt64(string s)
  222. {
  223. return Int64.Parse(s, CultureInfo.InvariantCulture);
  224. }
  225. [CLSCompliant (false)]
  226. public static SByte ToSByte(string s)
  227. {
  228. return SByte.Parse(s, CultureInfo.InvariantCulture);
  229. }
  230. public static float ToSingle(string s)
  231. {
  232. if (s == "INF") return System.Single.PositiveInfinity;
  233. if (s == "-INF") return System.Single.NegativeInfinity;
  234. if (s == "NaN") return System.Single.NaN;
  235. return Single.Parse(s, CultureInfo.InvariantCulture);
  236. }
  237. public static string ToString(Guid value)
  238. {
  239. return value.ToString("D",CultureInfo.InvariantCulture);
  240. }
  241. public static string ToString(int value)
  242. {
  243. return value.ToString(CultureInfo.InvariantCulture);
  244. }
  245. public static string ToString(short value)
  246. {
  247. return value.ToString(CultureInfo.InvariantCulture);
  248. }
  249. public static string ToString(byte value)
  250. {
  251. return value.ToString(CultureInfo.InvariantCulture);
  252. }
  253. public static string ToString(long value)
  254. {
  255. return value.ToString(CultureInfo.InvariantCulture);
  256. }
  257. public static string ToString(char value)
  258. {
  259. return value.ToString(CultureInfo.InvariantCulture);
  260. }
  261. public static string ToString(bool value)
  262. {
  263. if (value) return "true";
  264. return "false";
  265. }
  266. [CLSCompliant (false)]
  267. public static string ToString(SByte value)
  268. {
  269. return value.ToString(CultureInfo.InvariantCulture);
  270. }
  271. public static string ToString(Decimal value)
  272. {
  273. return value.ToString(CultureInfo.InvariantCulture);
  274. }
  275. [CLSCompliant (false)]
  276. public static string ToString(UInt64 value)
  277. {
  278. return value.ToString(CultureInfo.InvariantCulture);
  279. }
  280. public static string ToString(TimeSpan value)
  281. {
  282. StringBuilder builder = new StringBuilder();
  283. if (value.Ticks < 0) {
  284. builder.Append('-');
  285. value = value.Negate();
  286. }
  287. builder.Append('P');
  288. if (value.Days > 0) builder.Append(value.Days).Append('D');
  289. if (value.Days > 0 || value.Minutes > 0 || value.Seconds > 0 || value.Milliseconds > 0) {
  290. builder.Append('T');
  291. if (value.Hours > 0) builder.Append(value.Hours).Append('D');
  292. if (value.Minutes > 0) builder.Append(value.Minutes).Append('M');
  293. if (value.Seconds > 0 || value.Milliseconds > 0) {
  294. builder.Append(value.Seconds);
  295. if (value.Milliseconds > 0) builder.Append('.').Append(String.Format("{0:000}", value.Milliseconds));
  296. builder.Append('S');
  297. }
  298. }
  299. return builder.ToString();
  300. }
  301. public static string ToString(double value)
  302. {
  303. if (Double.IsNegativeInfinity(value)) return "-INF";
  304. if (Double.IsPositiveInfinity(value)) return "INF";
  305. if (Double.IsNaN(value)) return "INF";
  306. return value.ToString(CultureInfo.InvariantCulture);
  307. }
  308. public static string ToString(float value)
  309. {
  310. if (Single.IsNegativeInfinity(value)) return "-INF";
  311. if (Single.IsPositiveInfinity(value)) return "INF";
  312. if (Single.IsNaN(value)) return "INF";
  313. return value.ToString(CultureInfo.InvariantCulture);
  314. }
  315. [CLSCompliant (false)]
  316. public static string ToString(UInt32 value)
  317. {
  318. return value.ToString(CultureInfo.InvariantCulture);
  319. }
  320. [CLSCompliant (false)]
  321. public static string ToString(UInt16 value)
  322. {
  323. return value.ToString(CultureInfo.InvariantCulture);
  324. }
  325. public static string ToString(DateTime value)
  326. {
  327. return value.ToString("yyyy-MM-ddTHH:mm:ss.fffffffzzz", CultureInfo.InvariantCulture);
  328. }
  329. public static string ToString(DateTime value, string format)
  330. {
  331. return value.ToString(format, CultureInfo.InvariantCulture);
  332. }
  333. [MonoTODO]
  334. public static TimeSpan ToTimeSpan(string s)
  335. {
  336. return TimeSpan.Parse(s); // FIXME: Should Parse according to XML Schema spec
  337. }
  338. [CLSCompliant (false)]
  339. public static UInt16 ToUInt16(string s)
  340. {
  341. return UInt16.Parse(s, CultureInfo.InvariantCulture);
  342. }
  343. [CLSCompliant (false)]
  344. public static UInt32 ToUInt32(string s)
  345. {
  346. return UInt32.Parse(s, CultureInfo.InvariantCulture);
  347. }
  348. [CLSCompliant (false)]
  349. public static UInt64 ToUInt64(string s)
  350. {
  351. return UInt64.Parse(s, CultureInfo.InvariantCulture);
  352. }
  353. public static string VerifyName(string name)
  354. {
  355. Exception innerEx;
  356. if(name == null)
  357. throw new ArgumentNullException("name");
  358. if(XmlConstructs.IsValidName(name, out innerEx))
  359. return name;
  360. throw new XmlException("'"+name+"' is not a valid XML Name",null);
  361. }
  362. public static string VerifyNCName(string ncname)
  363. {
  364. Exception innerEx;
  365. if(ncname == null)
  366. throw new ArgumentNullException("ncname");
  367. if(XmlConstructs.IsValidNCName(ncname, out innerEx))
  368. return ncname;
  369. throw new XmlException("'"+ncname+"' is not a valid XML NCName",innerEx);
  370. }
  371. }
  372. }