static void Main(string[] args)
        {
            //WriteLine($"  xyz  {{}}   ");

            String pkt = "PSI!CI!<incident_no>!<report_date>!<incident_date>!<FCL_URN>![Custom_Field_MapBookRef]!<stop_datetime>!<patrol_mode>!<type>!<agency>!<status>!<vehicle_count>!<hide_flag>!<alert_level>!<alert_level_text>!<street>!<amg_easting>!<amg_northing>";
            //String pkt = "<xyz_address>!<amg_northing>";
            var pktArr = pkt.Split('!');


            String xmls = "<book> <value> incident_no:int::Incident.Number:int </value>" +
                          "<value> street:varchar(255)::Incident.Address.StreetOne:string </value>" +
                          "<value> amg_easting:varchar(255)::Incident.Address.Position.X:double </value>" +
                          "<value> amg_northing:varchar(255)::Incident.Address.Position.Y:double </value>" +
                          //"<value> mapref:varchar(45)::Incident.MapBookRef:String </value>" +
                          "</book> ";

            //String xmls = "<book> <value> xyz_address:string::Incident.XYZ.StreetOne:string  </value>" +
            //               "</book> ";


            System.IO.StringReader xmlFile = new System.IO.StringReader(xmls);
            DataSet ds = new DataSet();

            ds.ReadXml(xmlFile);


            Dictionary <string, string> KeyValue = new Dictionary <string, string>();

            Incident inc = new Incident();

            inc.Address            = new Address();
            inc.Address.StreetOne  = "XYZ";
            inc.Number             = "000707-30112016";
            inc.Address.Position   = new Coordinate();
            inc.Address.Position.X = 12345;
            inc.Address.Position.Y = 67890;

            //object zipCode = FollowPropertyPath(inc, "Address.StreetOne");
            //object zipCode = FollowPropertyPath(inc, "Number");


            //Custom Field
            //MB - 400 - E21 and SA-46 - B1
            //MB for Map Book or SA for Street Atlas
            //regex : ^.{0,2}\s*-\s*\d*\s*-\s*\w*\s*
            //regex1: ^(SA|MB|sa|mb)\s*-
            Regex regex = new Regex(@"^(SA|MB|sa|mb)\s*-\s*(\d*)\s*-\s*(\w*)\s*");
            Match match = regex.Match("MB - 400 - E21");

            if (match.Success)
            {
                Console.WriteLine("Found Match for {0}", match.Value);
                Console.WriteLine("ID was {0}", match.Groups[1].Value);
                Console.WriteLine("ID was {0}", match.Groups[2].Value);
                Console.WriteLine("ID was {0}", match.Groups[3].Value);
            }



            //Iterate Packet fields
            foreach (string item in pktArr)
            {
                //Condition to check valid field type
                if (item.Contains("<") && item.Contains(">"))
                {
                    //Interpolate string using $
                    Write($"Pkt: {item}");


                    var id = (from DataRow dr in ds.Tables[0].Rows
                              where (string)dr[0] == item.Replace("<", "").Replace(">", "")
                              select dr).FirstOrDefault();

                    var rowValue = (from DataRow dr in ds.Tables[0].Rows
                                    where dr[0].ToString().Contains(item.Replace("<", "").Replace(">", ""))
                                    select dr[0]).FirstOrDefault();

                    if (rowValue != null)
                    {
                        WriteLine($"  Pkt Mapping: {rowValue?.ToString()}");


                        //split mapping as Source :: Destination
                        var mapArr = rowValue?.ToString().Split(new string[] { "::" }, StringSplitOptions.None);


                        string vProp = mapArr[1].Split(':')[0];

                        if (vProp.Contains('.') && vProp.Split('.').Count() <= 2)
                        {
                            int pos = vProp.LastIndexOf(".") + 1;
                            vProp = vProp.Substring(pos, vProp.Length - pos);
                            //var value = (string)inc.GetType().GetProperty(vProp).GetValue(inc, null);
                            var value = FollowPropertyPath(inc, vProp);
                            KeyValue.Add(item, value?.ToString());
                        }
                        else
                        {
                            int pos = vProp.IndexOf(".") + 1;
                            vProp = vProp.Substring(pos, vProp.Length - pos);
                            var value = FollowPropertyPath(inc, vProp);
                            KeyValue.Add(item, value?.ToString());
                        }
                    }
                }
            }

            //Create send packet

            List <string> strArr = new List <string>();

            foreach (string item in pktArr)
            {
                if (item.Contains("<") && item.Contains(">") && KeyValue.ContainsKey(item))
                {
                    strArr.Add(KeyValue[item]);
                }
                //[Custom_Field_MapBookRef]
                else if (item.Contains("[") && item.Contains("]") && item.StartsWith("[Custom_Field_"))
                {
                    if (item.ToUpper().Equals("[Custom_Field_MapBookRef]") && item.Equals("[custom_field_mapbookref]"))
                    {
                        strArr.Add("5999-55612");
                    }
                    else
                    {
                        strArr.Add("CustomValue");
                    }
                }
                else
                {
                    if (item.Contains("<") && item.Contains(">"))
                    {
                        strArr.Add(string.Empty);
                    }
                    else
                    {
                        strArr.Add(item);
                    }
                }
            }

            Console.ReadLine();
        }