2 // System.Xml.XmlConvert
5 // Dwivedi, Ajay kumar (Adwiv@Yahoo.com)
6 // Gonzalo Paniagua Javier (gonzalo@ximian.com)
7 // Alan Tam Siu Lung (Tam@SiuLung.com)
8 // Atsushi Enomoto (ginga@kit.h-ho.ne.jp)
10 // (C) 2002 Ximian, Inc (http://www.ximian.com)
14 using System.Globalization;
16 namespace System.Xml {
18 public class XmlConvert {
20 static string encodedColon = "_x003A_";
25 private static string TryDecoding (string s)
27 if (s == null || s.Length < 6)
32 c = (char) Int32.Parse (s.Substring (1, 4), NumberStyles.HexNumber);
34 return s [0] + DecodeName (s.Substring (1));
39 return c + DecodeName (s.Substring (6));
42 public static string DecodeName (string name)
44 if (name == null || name.Length == 0)
47 int pos = name.IndexOf ('_');
48 if (pos == -1 || pos + 6 >= name.Length)
51 if (Char.ToUpper (name [pos + 1]) != 'X' || name [pos + 6] != '_')
52 return name [0] + DecodeName (name.Substring (1));
54 return name.Substring (0, pos) + TryDecoding (name.Substring (pos + 1));
57 public static string EncodeLocalName (string name)
59 string encoded = EncodeName (name);
60 int pos = encoded.IndexOf (':');
63 return encoded.Replace (":", encodedColon);
66 internal static bool IsInvalid (char c, bool firstOnlyLetter)
68 if (c == ':') // Special case. allowed in EncodeName, but encoded in EncodeLocalName
72 return !XmlChar.IsFirstNameChar (c);
74 return !XmlChar.IsNameChar (c);
77 private static string EncodeName (string name, bool nmtoken)
79 StringBuilder sb = new StringBuilder ();
80 int length = name.Length;
81 for (int i = 0; i < length; i++) {
83 if (IsInvalid (c, i == 0 && !nmtoken))
84 sb.AppendFormat ("_x{0:X4}_", (int) c);
85 else if (c == '_' && i + 6 < length && name [i+1] == 'x' && name [i + 6] == '_')
86 sb.Append ("_x005F_");
90 return sb.ToString ();
93 public static string EncodeName (string name)
95 return EncodeName (name, false);
98 public static string EncodeNmToken(string name)
100 return EncodeName (name, true);
103 // {true, false, 1, 0}
104 public static bool ToBoolean(string s)
106 s = s.Trim (XmlChar.WhitespaceChars);
118 throw new FormatException(s + " is not a valid boolean value");
122 public static byte ToByte(string s)
124 return Byte.Parse(s, CultureInfo.InvariantCulture);
127 public static char ToChar(string s)
129 return Char.Parse(s);
132 public static DateTime ToDateTime(string s)
134 return ToDateTime(s, new string[] {
136 "yyyy-MM-ddTHH:mm:ss",
137 "yyyy-MM-ddTHH:mm:ss.f",
138 "yyyy-MM-ddTHH:mm:ss.ff",
139 "yyyy-MM-ddTHH:mm:ss.fff",
140 "yyyy-MM-ddTHH:mm:ss.ffff",
141 "yyyy-MM-ddTHH:mm:ss.fffff",
142 "yyyy-MM-ddTHH:mm:ss.ffffff",
143 "yyyy-MM-ddTHH:mm:ss.fffffff",
144 "yyyy-MM-ddTHH:mm:sszzz",
145 "yyyy-MM-ddTHH:mm:ss.fzzz",
146 "yyyy-MM-ddTHH:mm:ss.ffzzz",
147 "yyyy-MM-ddTHH:mm:ss.fffzzz",
148 "yyyy-MM-ddTHH:mm:ss.ffffzzz",
149 "yyyy-MM-ddTHH:mm:ss.fffffzzz",
150 "yyyy-MM-ddTHH:mm:ss.ffffffzzz",
151 "yyyy-MM-ddTHH:mm:ss.fffffffzzz",
152 "yyyy-MM-ddTHH:mm:ssZ",
153 "yyyy-MM-ddTHH:mm:ss.fZ",
154 "yyyy-MM-ddTHH:mm:ss.ffZ",
155 "yyyy-MM-ddTHH:mm:ss.fffZ",
156 "yyyy-MM-ddTHH:mm:ss.ffffZ",
157 "yyyy-MM-ddTHH:mm:ss.fffffZ",
158 "yyyy-MM-ddTHH:mm:ss.ffffffZ",
159 "yyyy-MM-ddTHH:mm:ss.fffffffZ",
175 "HH:mm:ss.ffffffzzz",
176 "HH:mm:ss.fffffffzzz",
208 public static DateTime ToDateTime(string s, string format)
210 DateTimeFormatInfo d = new DateTimeFormatInfo();
211 d.FullDateTimePattern = format;
212 return DateTime.Parse(s, d);
215 public static DateTime ToDateTime(string s, string[] formats)
217 DateTimeStyles style = DateTimeStyles.AllowLeadingWhite |
218 DateTimeStyles.AllowTrailingWhite;
219 return DateTime.ParseExact (s, formats, DateTimeFormatInfo.InvariantInfo, style);
222 public static Decimal ToDecimal(string s)
224 return Decimal.Parse(s, CultureInfo.InvariantCulture);
227 public static double ToDouble(string s)
229 if (s == "INF") return System.Double.PositiveInfinity;
230 if (s == "-INF") return System.Double.NegativeInfinity;
231 if (s == "NaN") return System.Double.NaN;
232 return Double.Parse(s, CultureInfo.InvariantCulture);
235 public static Guid ToGuid(string s)
240 public static short ToInt16(string s)
242 return Int16.Parse(s, CultureInfo.InvariantCulture);
245 public static int ToInt32(string s)
247 return Int32.Parse(s, CultureInfo.InvariantCulture);
250 public static long ToInt64(string s)
252 return Int64.Parse(s, CultureInfo.InvariantCulture);
255 [CLSCompliant (false)]
256 public static SByte ToSByte(string s)
258 return SByte.Parse(s, CultureInfo.InvariantCulture);
261 public static float ToSingle(string s)
263 if (s == "INF") return System.Single.PositiveInfinity;
264 if (s == "-INF") return System.Single.NegativeInfinity;
265 if (s == "NaN") return System.Single.NaN;
266 return Single.Parse(s, CultureInfo.InvariantCulture);
269 public static string ToString(Guid value)
271 return value.ToString("D",CultureInfo.InvariantCulture);
274 public static string ToString(int value)
276 return value.ToString(CultureInfo.InvariantCulture);
279 public static string ToString(short value)
281 return value.ToString(CultureInfo.InvariantCulture);
284 public static string ToString(byte value)
286 return value.ToString(CultureInfo.InvariantCulture);
289 public static string ToString(long value)
291 return value.ToString(CultureInfo.InvariantCulture);
294 public static string ToString(char value)
296 return value.ToString(CultureInfo.InvariantCulture);
299 public static string ToString(bool value)
301 if (value) return "true";
305 [CLSCompliant (false)]
306 public static string ToString(SByte value)
308 return value.ToString(CultureInfo.InvariantCulture);
311 public static string ToString(Decimal value)
313 return value.ToString(CultureInfo.InvariantCulture);
316 [CLSCompliant (false)]
317 public static string ToString(UInt64 value)
319 return value.ToString(CultureInfo.InvariantCulture);
322 public static string ToString(TimeSpan value)
324 StringBuilder builder = new StringBuilder();
325 if (value.Ticks < 0) {
327 value = value.Negate();
330 if (value.Days > 0) builder.Append(value.Days).Append('D');
331 if (value.Days > 0 || value.Minutes > 0 || value.Seconds > 0 || value.Milliseconds > 0) {
333 if (value.Hours > 0) builder.Append(value.Hours).Append('D');
334 if (value.Minutes > 0) builder.Append(value.Minutes).Append('M');
335 if (value.Seconds > 0 || value.Milliseconds > 0) {
336 builder.Append(value.Seconds);
337 if (value.Milliseconds > 0) builder.Append('.').Append(String.Format("{0:000}", value.Milliseconds));
341 return builder.ToString();
344 public static string ToString(double value)
346 if (Double.IsNegativeInfinity(value)) return "-INF";
347 if (Double.IsPositiveInfinity(value)) return "INF";
348 if (Double.IsNaN(value)) return "NaN";
349 return value.ToString(CultureInfo.InvariantCulture);
352 public static string ToString(float value)
354 if (Single.IsNegativeInfinity(value)) return "-INF";
355 if (Single.IsPositiveInfinity(value)) return "INF";
356 if (Single.IsNaN(value)) return "NaN";
357 return value.ToString(CultureInfo.InvariantCulture);
360 [CLSCompliant (false)]
361 public static string ToString(UInt32 value)
363 return value.ToString(CultureInfo.InvariantCulture);
366 [CLSCompliant (false)]
367 public static string ToString(UInt16 value)
369 return value.ToString(CultureInfo.InvariantCulture);
372 public static string ToString(DateTime value)
374 return value.ToString("yyyy-MM-ddTHH:mm:ss.fffffffzzz", CultureInfo.InvariantCulture);
377 public static string ToString(DateTime value, string format)
379 return value.ToString(format, CultureInfo.InvariantCulture);
383 public static TimeSpan ToTimeSpan(string s)
385 return TimeSpan.Parse(s); // FIXME: Should Parse according to XML Schema spec
388 [CLSCompliant (false)]
389 public static UInt16 ToUInt16(string s)
391 return UInt16.Parse(s, CultureInfo.InvariantCulture);
394 [CLSCompliant (false)]
395 public static UInt32 ToUInt32(string s)
397 return UInt32.Parse(s, CultureInfo.InvariantCulture);
400 [CLSCompliant (false)]
401 public static UInt64 ToUInt64(string s)
403 return UInt64.Parse(s, CultureInfo.InvariantCulture);
406 public static string VerifyName (string name)
409 throw new ArgumentNullException("name");
411 if(!XmlChar.IsName (name))
412 throw new XmlException("'" + name + "' is not a valid XML Name");
417 public static string VerifyNCName(string ncname)
420 throw new ArgumentNullException("ncname");
422 if(!XmlChar.IsNCName (ncname))
423 throw new XmlException ("'" + ncname + "' is not a valid XML NCName");
427 // It is documented as public method, but in fact it is not.
428 internal static byte [] FromBinHexString (string s)
430 char [] chars = s.ToCharArray ();
431 byte [] bytes = new byte [chars.Length / 2 + chars.Length % 2];
432 FromBinHexString (chars, 0, chars.Length, bytes);
436 internal static int FromBinHexString (char [] chars, int offset, int charLength, byte [] buffer)
438 int bufIndex = offset;
439 for (int i = 0; i < charLength - 1; i += 2) {
440 buffer [bufIndex] = (chars [i] > '9' ?
441 (byte) (chars [i] - 'A' + 10) :
442 (byte) (chars [i] - '0'));
443 buffer [bufIndex] <<= 4;
444 buffer [bufIndex] += chars [i + 1] > '9' ?
445 (byte) (chars [i + 1] - 'A' + 10) :
446 (byte) (chars [i + 1] - '0');
449 if (charLength %2 != 0)
450 buffer [bufIndex++] = (byte)
451 ((chars [charLength - 1] > '9' ?
452 (byte) (chars [charLength - 1] - 'A' + 10) :
453 (byte) (chars [charLength - 1] - '0'))
456 return bufIndex - offset;