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