/// <summary>
        /// Check that the attribute transition@nextState is a valid state.
        /// </summary>
        /// <param name="reader">The Xml reader.</param>
        /// <param name="model">The State Machine Model</param>
        private void ValidateTransitionNextState(XmlReader reader, StateMachineType model)
        {
            string nextStateName = reader.Value;

            ts.TraceEvent(TraceEventType.Verbose, 1, "ValidateTransitionNextState next state {0}", nextStateName);
            StateType nextState = model.GetStateType(nextStateName);

            if (nextState == null)
            {
                string error = "Next state " + nextStateName + " does not exist";
                ReportError(reader, ERROR_NEXT_STATE_DOES_NOT_EXIST, error);
            }
        }
        /// <summary>
        /// Validate the state element. This is a recursive function.
        /// </summary>
        /// <param name="reader">The Xml reader.</param>
        /// <param name="model">The State Machine Model</param>
        private void ValidateState(XmlReader reader, StateMachineType model)
        {
            string    stateName = reader[TAG_STATE_NAME];
            StateType state     = model.GetStateType(stateName);

            if (state == null)
            {
                string error = "Cannot find state " + stateName;
                ReportError(reader, ERROR_INTERNAL, error);
                return;
            }

            if (this.stateMap.ContainsKey(stateName) == true)
            {
                string error = "Duplicated state " + stateName;
                ReportError(reader, ERROR_STATE_DUPLICATED, error);
                return;
            }
            else
            {
                this.stateMap[stateName] = stateName;
            }

            ts.TraceEvent(TraceEventType.Verbose, 1, "ValidateState {0}", stateName);

            using (XmlReader subReader = reader.ReadSubtree())
            {
                while (reader.MoveToNextAttribute())
                {
                    if (reader.Name == TAG_KIND)
                    {
                        ValidateStateKind(reader, model, state);
                    }
                }

                while (subReader.Read())
                {
                    switch (subReader.NodeType)
                    {
                    case XmlNodeType.Element:
                        if (subReader.Name == TAG_STATE)
                        {
                            ValidateState(subReader, model);
                        }
                        else if (reader.Name == TAG_TRANSITION)
                        {
                            ValidateTransition(subReader, model, state);
                        }
                        else if (reader.Name == TAG_ONENTRY)
                        {
                            ValidateEntryExit(subReader, model, state);
                        }
                        else if (reader.Name == TAG_ONEXIT)
                        {
                            ValidateEntryExit(subReader, model, state);
                        }
                        else if (reader.Name == TAG_PARALLEL)
                        {
                            ValidateParallel(subReader, model, state);
                        }
                        break;
                    }
                }
            }
        }