public static void SerializeLLSDXmlElement(osUTF8 mb, OSD data, bool formal)
        {
            switch (data.Type)
            {
            case OSDType.Unknown:
                mb.Append(osUTF8Const.XMLundef);
                break;

            case OSDType.Boolean:
                if (data.AsBoolean())
                {
                    mb.Append(osUTF8Const.XMLfullbooleanOne);
                }
                else
                {
                    mb.Append(osUTF8Const.XMLfullbooleanZero);
                }
                break;

            case OSDType.Integer:
                mb.Append(osUTF8Const.XMLintegerStart);
                mb.AppendInt(data.AsInteger());
                mb.Append(osUTF8Const.XMLintegerEnd);
                break;

            case OSDType.Real:
                mb.Append(osUTF8Const.XMLrealStart);
                mb.AppendASCII(data.ToString());
                mb.Append(osUTF8Const.XMLrealEnd);
                break;

            case OSDType.String:
                mb.Append(osUTF8Const.XMLstringStart);
                EscapeToXML(mb, data);
                mb.Append(osUTF8Const.XMLstringEnd);
                break;

            case OSDType.UUID:
                mb.Append(osUTF8Const.XMLuuidStart);
                mb.AppendUUID(data.AsUUID());
                mb.Append(osUTF8Const.XMLuuidEnd);
                break;

            case OSDType.Date:
                mb.Append(osUTF8Const.XMLdateStart);
                mb.AppendASCII(data.ToString());
                mb.Append(osUTF8Const.XMLdateEnd);
                break;

            case OSDType.URI:
                mb.Append(osUTF8Const.XMLuriStart);
                EscapeToXML(mb, data.ToString());
                mb.Append(osUTF8Const.XMLuriEnd);
                break;

            case OSDType.Binary:
                if (formal)
                {
                    mb.Append(osUTF8Const.XMLformalBinaryStart);
                }
                else
                {
                    mb.Append(osUTF8Const.XMLbinaryStart);
                }
                base64Encode(data.AsBinary(), mb);
                mb.Append(osUTF8Const.XMLbinaryEnd);
                break;

            case OSDType.Map:
                mb.Append(osUTF8Const.XMLmapStart);
                foreach (KeyValuePair <string, OSD> kvp in (OSDMap)data)
                {
                    mb.Append(osUTF8Const.XMLkeyStart);
                    mb.Append(kvp.Key.ToString());
                    mb.Append(osUTF8Const.XMLkeyEnd);

                    SerializeLLSDXmlElement(mb, kvp.Value, formal);
                }
                mb.Append(osUTF8Const.XMLmapEnd);
                break;

            case OSDType.Array:
                OSDArray array = (OSDArray)data;
                mb.Append(osUTF8Const.XMLarrayStart);
                for (int i = 0; i < array.Count; i++)
                {
                    SerializeLLSDXmlElement(mb, array[i], formal);
                }
                mb.Append(osUTF8Const.XMLarrayEnd);
                break;

            case OSDType.LLSDxml:
                mb.Append(data.AsString());
                break;

            default:
                break;
            }
        }