implementing XmlElement.SetAttributeNode(localName, namespaceURI) and
[mono.git] / mcs / class / System.XML / System.Xml / XmlConvert.cs
index d825741c819822e87e3ee1daabd43b1dd4d94981..cc078e21fdc1a80aaee92fb296998a6ad581fc19 100755 (executable)
-//
-// XmlConvert.cs: Xml data type conversion
-//
-// Only a stub for now
-//
-using System;
-
-namespace System.Xml {
-
-       public class XmlConvert {
-
-               public static string VerifyNCName (string name)
-               {
-                       throw new NotImplementedException ();
-               }
-       }
-}
+//\r
+// System.Xml.XmlConvert\r
+//\r
+// Authors:\r
+//      Dwivedi, Ajay kumar (Adwiv@Yahoo.com)\r
+//     Gonzalo Paniagua Javier (gonzalo@ximian.com)\r
+//\r
+// (C) 2002 Ximian, Inc (http://www.ximian.com)\r
+//\r
+using System;\r
+using System.Text;\r
+using System.Globalization;\r
+\r
+namespace System.Xml {\r
+\r
+       public class XmlConvert {\r
+\r
+               static string encodedColon = "_x003A_";\r
+\r
+               public XmlConvert()\r
+               {}\r
+\r
+               private static string TryDecoding (string s)\r
+               {\r
+                       if (s == null || s.Length < 6)\r
+                               return s;\r
+\r
+                       char c = '\uFFFF';\r
+                       try {\r
+                               c = (char) Int32.Parse (s.Substring (1, 4), NumberStyles.HexNumber);\r
+                       } catch {\r
+                               return s [0] + DecodeName (s.Substring (1));\r
+                       }\r
+                       \r
+                       if (s.Length == 6)\r
+                               return c.ToString ();\r
+                       return c + DecodeName (s.Substring (6));\r
+               }\r
+               \r
+               public static string DecodeName (string name)\r
+               {\r
+                       if (name == null || name.Length == 0)\r
+                               return name;\r
+\r
+                       int pos = name.IndexOf ('_');\r
+                       if (pos == -1 || pos + 6 >= name.Length)\r
+                               return name;\r
+\r
+                       if (Char.ToUpper (name [pos + 1]) != 'X' || name [pos + 6] != '_')\r
+                               return name [0] + DecodeName (name.Substring (1));\r
+\r
+                       return name.Substring (0, pos) + TryDecoding (name.Substring (pos + 1));\r
+               }\r
+\r
+               public static string EncodeLocalName (string name)\r
+               {\r
+                       string encoded = EncodeName (name);\r
+                       int pos = encoded.IndexOf (':');\r
+                       if (pos == -1)\r
+                               return encoded;\r
+                       return encoded.Replace (":", encodedColon);\r
+               }\r
+\r
+               private static bool IsInvalid (char c, bool firstOnlyLetter)\r
+               {\r
+                       if (c == ':') // Special case. allowed in EncodeName, but encoded in EncodeLocalName\r
+                               return false;\r
+                       \r
+                       if (firstOnlyLetter && !Char.IsLetter (c) && c != '_')\r
+                               return false;\r
+                       \r
+                       return !Char.IsLetterOrDigit (c);\r
+               }\r
+\r
+               private static string EncodeName (string name, bool nmtoken)\r
+               {\r
+                       StringBuilder sb = new StringBuilder ();\r
+                       int length = name.Length;\r
+                       for (int i = 0; i < length; i++) {\r
+                               char c = name [i];\r
+                               if (c != '_' || i + 6 >= length) {\r
+                                       bool firstOnlyLetter = (i == 0 && !nmtoken);\r
+                                       if (IsInvalid (c, firstOnlyLetter)) {\r
+                                               sb.AppendFormat ("_x{0:X4}_", (int) c);\r
+                                               continue;\r
+                                       }\r
+                               } else { \r
+                                       if (Char.ToUpper (name [i + 1]) == 'X' && name [i + 6] == '_') {\r
+                                               string decoded = TryDecoding (name.Substring (i + 1, 6));\r
+                                               if (decoded.Length == 1) {\r
+                                                       sb.AppendFormat ("_x{0:X4}_", (int) c);\r
+                                                       continue;\r
+                                               }\r
+                                       }\r
+                               }\r
+                               sb.Append (c);\r
+                       }\r
+                       return sb.ToString ();\r
+               }\r
+\r
+               public static string EncodeName (string name)\r
+               {\r
+                       return EncodeName (name, false);\r
+               }\r
+               \r
+               public static string EncodeNmToken(string name)\r
+               {\r
+                       return EncodeName (name, true);\r
+               }\r
+\r
+               // {true, false, 1, 0}\r
+               public static bool ToBoolean(string s)\r
+               {\r
+                       s = s.Trim();\r
+                       switch(s)\r
+                       {\r
+                               case "1":\r
+                                       return true;\r
+                               case "true":\r
+                                       return true;\r
+                               case "0":\r
+                                       return false;\r
+                               case "false":\r
+                                       return false;\r
+                               default:\r
+                                       throw new FormatException(s + " is not a valid boolean value");\r
+                       }\r
+               }\r
+\r
+               public static byte ToByte(string s)\r
+               {\r
+                       return Byte.Parse(s, CultureInfo.InvariantCulture);\r
+               }\r
+\r
+               public static char ToChar(string s)\r
+               {\r
+                       return Char.Parse(s);\r
+               }\r
+\r
+               public static DateTime ToDateTime(string s)\r
+               {\r
+                       return DateTime.Parse(s);\r
+               }\r
+\r
+               public static DateTime ToDateTime(string s, string format)\r
+               {\r
+                       DateTimeFormatInfo d = new DateTimeFormatInfo();\r
+                       d.FullDateTimePattern = format;\r
+                       return DateTime.Parse(s, d);\r
+               }\r
+\r
+               public static DateTime ToDateTime(string s, string[] formats)\r
+               {\r
+                       DateTimeStyles style = DateTimeStyles.AllowLeadingWhite |\r
+                                              DateTimeStyles.AllowTrailingWhite;\r
+                       return DateTime.ParseExact (s, formats, DateTimeFormatInfo.InvariantInfo, style);\r
+               }\r
+               \r
+               public static Decimal ToDecimal(string s)\r
+               {\r
+                       return Decimal.Parse(s, CultureInfo.InvariantCulture);\r
+               }\r
+               \r
+               public static double ToDouble(string s)\r
+               {\r
+                       return Double.Parse(s, CultureInfo.InvariantCulture);\r
+               }\r
+\r
+               public static Guid ToGuid(string s)\r
+               {\r
+                       return new Guid(s);\r
+               }\r
+\r
+               public static short ToInt16(string s)\r
+               {\r
+                       return Int16.Parse(s, CultureInfo.InvariantCulture);\r
+               }\r
+\r
+               public static int ToInt32(string s)\r
+               {\r
+                       return Int32.Parse(s, CultureInfo.InvariantCulture);\r
+               }\r
+\r
+               public static long ToInt64(string s)\r
+               {\r
+                       return Int64.Parse(s, CultureInfo.InvariantCulture);\r
+               }\r
+\r
+               [CLSCompliant (false)]\r
+               public static SByte ToSByte(string s)\r
+               {\r
+                       return SByte.Parse(s, CultureInfo.InvariantCulture);\r
+               }\r
+\r
+               public static float ToSingle(string s)\r
+               {\r
+                       return Single.Parse(s, CultureInfo.InvariantCulture);\r
+               }\r
+\r
+               public static string ToString(Guid value)\r
+               {\r
+                       return value.ToString("D",CultureInfo.InvariantCulture);\r
+               }\r
+\r
+               public static string ToString(int value)\r
+               {\r
+                       return value.ToString(CultureInfo.InvariantCulture);\r
+               }\r
+\r
+               public static string ToString(short value)\r
+               {\r
+                       return value.ToString(CultureInfo.InvariantCulture);\r
+               }\r
+\r
+               public static string ToString(byte value)\r
+               {\r
+                       return value.ToString(CultureInfo.InvariantCulture);\r
+               }\r
+\r
+               public static string ToString(long value)\r
+               {\r
+                       return value.ToString(CultureInfo.InvariantCulture);\r
+               }\r
+\r
+               public static string ToString(char value)\r
+               {\r
+                       return value.ToString(CultureInfo.InvariantCulture);\r
+               }\r
+\r
+               public static string ToString(bool value)\r
+               {\r
+                       return value.ToString(CultureInfo.InvariantCulture);\r
+               }\r
+\r
+               [CLSCompliant (false)]\r
+               public static string ToString(SByte value)\r
+               {\r
+                       return value.ToString(CultureInfo.InvariantCulture);\r
+               }\r
+               public static string ToString(Decimal value)\r
+               {\r
+                       return value.ToString(CultureInfo.InvariantCulture);\r
+               }\r
+\r
+               [CLSCompliant (false)]\r
+               public static string ToString(UInt64 value)\r
+               {\r
+                       return value.ToString(CultureInfo.InvariantCulture);\r
+               }\r
+               public static string ToString(TimeSpan value)\r
+               {\r
+                       return value.ToString();\r
+               }\r
+               public static string ToString(double value)\r
+               {\r
+                       return value.ToString(CultureInfo.InvariantCulture);\r
+               }\r
+               public static string ToString(float value)\r
+               {\r
+                       return value.ToString(CultureInfo.InvariantCulture);\r
+               }\r
+\r
+               [CLSCompliant (false)]\r
+               public static string ToString(UInt32 value)\r
+               {\r
+                       return value.ToString(CultureInfo.InvariantCulture);\r
+               }\r
+\r
+               [CLSCompliant (false)]\r
+               public static string ToString(UInt16 value)\r
+               {\r
+                       return value.ToString(CultureInfo.InvariantCulture);\r
+               }\r
+               public static string ToString(DateTime value)\r
+               {\r
+                       return value.ToString(CultureInfo.InvariantCulture);\r
+               }\r
+               public static string ToString(DateTime value, string format)\r
+               {\r
+                       return value.ToString(format, CultureInfo.InvariantCulture);\r
+               }\r
+               public static TimeSpan ToTimeSpan(string s)\r
+               {\r
+                       return TimeSpan.Parse(s);\r
+               }\r
+\r
+               [CLSCompliant (false)]\r
+               public static UInt16 ToUInt16(string s)\r
+               {\r
+                       return UInt16.Parse(s, CultureInfo.InvariantCulture);\r
+               }\r
+\r
+               [CLSCompliant (false)]\r
+               public static UInt32 ToUInt32(string s)\r
+               {\r
+                       return UInt32.Parse(s, CultureInfo.InvariantCulture);\r
+               }\r
+\r
+               [CLSCompliant (false)]\r
+               public static UInt64 ToUInt64(string s)\r
+               {\r
+                       return UInt64.Parse(s, CultureInfo.InvariantCulture);\r
+               }\r
+\r
+               public static string VerifyName(string name)\r
+               {\r
+                       Exception innerEx;\r
+                       if(name == null)\r
+                               throw new ArgumentNullException("name");\r
+\r
+                       if(XmlConstructs.IsValidName(name, out innerEx))\r
+                               return name;\r
+                       \r
+                       throw new XmlException("'"+name+"' is not a valid XML Name",null);\r
+               }\r
+\r
+               public static string VerifyNCName(string ncname)\r
+               {\r
+                       Exception innerEx;\r
+                       if(ncname == null)\r
+                               throw new ArgumentNullException("ncname");\r
+\r
+                       if(XmlConstructs.IsValidName(ncname, out innerEx))\r
+                               return ncname;\r
+                       \r
+                       throw new XmlException("'"+ncname+"' is not a valid XML NCName",innerEx);\r
+               }\r
+       }\r
+}\r