private static void TraverseXmlNode(XmlNode rootNode, InfoHashTable infoHashTable)
 {
     if (rootNode == null)
     {
         return;
     }
     if (rootNode is XmlElement)
     {
         if (rootNode.HasChildNodes)
         {
             if (rootNode.FirstChild.NodeType == XmlNodeType.Text)
             {
                 infoHashTable.Add(rootNode.Name, rootNode.FirstChild.Value);
             }
             else
             {
                 infoHashTable.Add(rootNode.Name, null);
                 TraverseXmlNode(rootNode.FirstChild, infoHashTable);
                 infoHashTable.Add("End", null);
             }
         }
         if (rootNode.NextSibling != null)
         {
             TraverseXmlNode(rootNode.NextSibling, infoHashTable);
         }
     }
 }
        public static void ModifyElementValue(String xmlName, InfoHashTable infoHashTable)
        {
            XmlDocument xmlDocument = new XmlDocument();

            xmlDocument.Load(xmlName);
            XmlNode rootNode        = xmlDocument.DocumentElement;
            XmlNode currentRootNode = null;
            XmlNode currentNode     = null;

            foreach (SingleHashTable singleHashTable in infoHashTable)
            {
                if (singleHashTable.Value == null)
                {
                    currentRootNode = rootNode.SelectSingleNode(singleHashTable.Key.ToString());
                }
                else
                {
                    if (currentRootNode != null && currentRootNode.HasChildNodes)
                    {
                        currentNode = currentRootNode.SelectSingleNode(singleHashTable.Key.ToString());
                        if (currentNode != null)
                        {
                            currentNode.InnerText = singleHashTable.Value.ToString();
                        }
                    }
                }
            }
            xmlDocument.Save(xmlName);
        }
        public void SaveAllDataBase()
        {
            String xmlName = dataBaseModel.FileName;

            xmlName      = DefaultPath.DefaultPathEx.DataBasePath + xmlName;
            defaultDatas = dataBaseModel.DataBaseValues;
            InfoHashTable infoHashTable = GetDefaultInfoHashTable();

            XmlHelper.CreateXml(infoHashTable, xmlName);
        }
        protected InfoHashTable GetDefaultInfoHashTable()//获得默认的数据表
        {
            InfoHashTable infoHashTable = new InfoHashTable();

            infoHashTable.Add(dataBaseModel.RootElementName, null);
            for (int i = 0; i < defaultHeadNames.Length; i++)  //1
            {
                infoHashTable.Add(defaultHeadNames[i], defaultDatas[i]);
            }
            infoHashTable.Add("End", null);
            return(infoHashTable);
        }
        public void SetDataBaseValue(PromptInfoModel promptInfoMode)
        {
            InfoHashTable infoHashTable = new InfoHashTable();

            String[] promptNames = promptInfoMode.DefaultValues;
            if (!File.Exists(dataBaseName))
            {
                infoHashTable.Add(rootElementName + "S", null);
                infoHashTable.Add("PromptInfoNumber", "1");
                infoHashTable.Add(rootElementName + "1", null);
                for (int i = 0; i < headNames.Length; i++)
                {
                    infoHashTable.Add(headNames[i], promptNames[i]);
                }
                infoHashTable.Add("End", null);
                infoHashTable.Add("End", null);
                XmlHelper.CreateXml(infoHashTable, dataBaseName);
            }
            else
            {
                int  infoIndex     = Convert.ToInt32(XmlHelper.GetElementValue(dataBaseName, "PromptInfoNumber"));
                bool appendElement = false;
                infoIndex++;
                if (infoIndex > maxLength)
                {
                    infoIndex = 1;
                }
                else
                {
                    appendElement = true;
                }
                XmlHelper.SetElementValue(dataBaseName, "PromptInfoNumber", infoIndex.ToString());
                infoHashTable.Add(rootElementName + infoIndex.ToString(), null);
                for (int i = 0; i < headNames.Length; i++)
                {
                    infoHashTable.Add(headNames[i], promptNames[i]);
                }
                infoHashTable.Add("End", null);
                if (appendElement)
                {
                    XmlHelper.AppendElementValues(infoHashTable, dataBaseName);
                }
                else
                {
                    XmlHelper.ModifyElementValue(dataBaseName, infoHashTable);
                }
            }
        }
        /// <summary>
        /// 遍历整个Xml,将读取元素名和元素的值
        /// </summary>
        /// <param name="xmlName"></param>
        /// <returns></returns>
        public static InfoHashTable ReadXmlValues(String xmlName)
        {
            InfoHashTable infoHashTable = new InfoHashTable();

            if (File.Exists(xmlName))
            {
                XmlDocument xmlDocument = new XmlDocument();
                try
                {
                    xmlDocument.Load(xmlName);
                    XmlNode rootNode = xmlDocument.DocumentElement;
                    TraverseXmlNode(rootNode, infoHashTable);
                    xmlDocument.Save(xmlName);
                    xmlDocument = null;
                }
                catch (Exception ex)
                {
                    PromptOccurPlace  promptOccurPlace  = PromptOccurPlace.XmlReadError;
                    PromptMessageType promptMessageType = PromptMessageType.Null;
                    if (ex is XmlException)
                    {
                        promptMessageType = PromptMessageType.XmlException;
                    }
                    else if (ex is IOException)
                    {
                        promptMessageType = PromptMessageType.IOException;
                    }
                    else if (ex is NullReferenceException)
                    {
                        promptMessageType = PromptMessageType.NullReferenceException;
                    }
                    else if (ex is UnauthorizedAccessException)
                    {
                        promptMessageType = PromptMessageType.UnauthorizedAccessException;
                    }
                    else if (ex is StackOverflowException)
                    {
                        promptMessageType = PromptMessageType.StackOverflowException;
                    }
                    else
                    {
                        promptMessageType = PromptMessageType.UnKnown;
                    }
                    ErrorMessage.SetErrorMessage(promptOccurPlace, promptMessageType, Path.GetFileName(xmlName));
                }
            }
            return(infoHashTable);
        }
        private String[] CreateNewXml(String xmlName)
        {
            String backName = GetBackFileName();

            String[] newXmlDatas       = null;
            bool     shouldCreatNewXml = true;

            if (backName != String.Empty)
            {
                backName = DefaultPath.DefaultPathEx.DataBasePath + backName;
                if (File.Exists(backName))
                {
                    File.Copy(backName, xmlName);
                    shouldCreatNewXml = false;
                }
            }
            if (shouldCreatNewXml)
            {
                InfoHashTable infoHashTable = GetDefaultInfoHashTable();
                XmlHelper.CreateXml(infoHashTable, xmlName);
                newXmlDatas = defaultDatas;
            }
            return(newXmlDatas);
        }
        public PromptInfoModel[] ReadPromptInfos()
        {
            InfoHashTable          infoHashTable       = XmlHelper.ReadXmlValues(dataBaseName);
            List <PromptInfoModel> promptInfoModelList = new List <PromptInfoModel>();
            PromptInfoModel        promptInfoModel     = null;
            String keyName = String.Empty;

            if (infoHashTable != null)
            {
                foreach (SingleHashTable singleHashTable in infoHashTable)
                {
                    keyName = singleHashTable.Key.ToString();
                    if (keyName == (rootElementName + "S") || keyName == "PromptInfoNumber")
                    {
                        continue;
                    }
                    if (keyName.IndexOf(rootElementName) != -1)
                    {
                        promptInfoModel = new PromptInfoModel();
                    }
                    else if (keyName.IndexOf("End") == -1)
                    {
                        PromptInfoEnum promptInfoEnum = (PromptInfoEnum)Enum.Parse(typeof(PromptInfoEnum), keyName, true);
                        switch (promptInfoEnum)
                        {
                        case PromptInfoEnum.OccurTime:
                            promptInfoModel.PromptTime = singleHashTable.Value.ToString();
                            break;

                        case PromptInfoEnum.PromptData:
                            promptInfoModel.PromptInfo = singleHashTable.Value.ToString();
                            break;

                        case PromptInfoEnum.PromptID:
                            promptInfoModel.PromptID = singleHashTable.Value.ToString();
                            break;

                        case PromptInfoEnum.PromptName:
                            promptInfoModel.PromptName = singleHashTable.Value.ToString();
                            break;

                        case PromptInfoEnum.RunTime:
                            promptInfoModel.RunTime = singleHashTable.Value.ToString();
                            break;

                        case PromptInfoEnum.Version:
                            promptInfoModel.CodeVersion = singleHashTable.Value.ToString();
                            break;

                        default:
                            break;
                        }
                    }
                    else
                    {
                        if (promptInfoModel != null)
                        {
                            promptInfoModelList.Add(promptInfoModel);
                            promptInfoModel = null;
                        }
                    }
                }
            }
            return(promptInfoModelList.ToArray());
        }
        public static void AppendElementValues(InfoHashTable hashTable, String xmlName)
        {
            XmlDocument xmlDocument = new XmlDocument();

            try
            {
                xmlDocument.Load(xmlName);
                XmlNode    rootNode      = xmlDocument.DocumentElement;
                XmlNode    appendNode    = null;
                XmlElement appendElement = null;
                foreach (String key in hashTable.Keys)
                {
                    if (hashTable[key] != null)
                    {
                        appendElement           = xmlDocument.CreateElement(key);
                        appendElement.InnerText = hashTable[key].ToString();
                        if (appendNode != null)
                        {
                            appendNode.AppendChild(appendElement);
                        }
                    }
                    else
                    {
                        if (key != "End")
                        {
                            appendNode = xmlDocument.CreateElement(key);
                        }
                        else
                        {
                            rootNode.AppendChild(appendNode);
                        }
                    }
                }
                xmlDocument.Save(xmlName);
            }
            catch (Exception ex)
            {
                PromptOccurPlace  promptOccurPlace  = PromptOccurPlace.XmlWriteError;
                PromptMessageType promptMessageType = PromptMessageType.Null;
                if (ex is XmlException)
                {
                    promptMessageType = PromptMessageType.XmlException;
                }
                else if (ex is IOException)
                {
                    promptMessageType = PromptMessageType.IOException;
                }
                else if (ex is NullReferenceException)
                {
                    promptMessageType = PromptMessageType.NullReferenceException;
                }
                else if (ex is UnauthorizedAccessException)
                {
                    promptMessageType = PromptMessageType.UnauthorizedAccessException;
                }
                else
                {
                    promptMessageType = PromptMessageType.UnKnown;
                }
                ErrorMessage.SetErrorMessage(promptOccurPlace, promptMessageType, Path.GetFileName(xmlName));
            }
        }
        /// <summary>
        /// 该函数用于读写只有一个父级,最简单的XML格式
        /// </summary>
        /// <param name="xmlName"></param>
        /// <param name="elementNames"></param>
        /// <returns></returns>
        public static InfoHashTable ReadXmlValues(String xmlName, String[] elementNams)
        {
            InfoHashTable infoHashTable = null;

            if (File.Exists(xmlName))
            {
                XmlDocument xmlDocument = new XmlDocument();
                try
                {
                    xmlDocument.Load(xmlName);
                    XmlNode xmlRootNode    = xmlDocument.DocumentElement;
                    XmlNode xmlCurrentNode = null;
                    infoHashTable = new InfoHashTable();
                    List <String> notFoundDataList = new List <string>();
                    for (int i = 0; i < elementNams.Length; i++)
                    {
                        xmlCurrentNode = xmlRootNode.SelectSingleNode(elementNams[i]);
                        if (xmlCurrentNode != null)
                        {
                            infoHashTable.Add(elementNams[i], xmlCurrentNode.InnerText);
                        }
                        else
                        {
                            infoHashTable.Add(elementNams[i], "0");
                            notFoundDataList.Add(elementNams[i]);
                        }
                    }
                    if (notFoundDataList.Count > 0)
                    {
                        for (int i = 0; i < notFoundDataList.Count; i++)
                        {
                            AppendElementValues(notFoundDataList[i], "0", xmlName);
                        }
                    }
                }
                catch (Exception ex)
                {
                    PromptOccurPlace  promptOccurPlace  = PromptOccurPlace.XmlReadError;
                    PromptMessageType promptMessageType = PromptMessageType.Null;
                    if (ex is XmlException)
                    {
                        promptMessageType = PromptMessageType.XmlException;
                    }
                    else if (ex is IOException)
                    {
                        promptMessageType = PromptMessageType.IOException;
                    }
                    else if (ex is NullReferenceException)
                    {
                        promptMessageType = PromptMessageType.NullReferenceException;
                    }
                    else if (ex is UnauthorizedAccessException)
                    {
                        promptMessageType = PromptMessageType.UnauthorizedAccessException;
                    }
                    else
                    {
                        promptMessageType = PromptMessageType.UnKnown;
                    }
                    ErrorMessage.SetErrorMessage(promptOccurPlace, promptMessageType, Path.GetFileName(xmlName));
                }
                finally
                {
                    xmlDocument = null;
                }
            }
            return(infoHashTable);
        }
        public static void CreateXml(InfoHashTable hashTable, String xmlName)
        {
            String directName = Path.GetDirectoryName(xmlName);

            if (!Directory.Exists(directName))
            {
                Directory.CreateDirectory(directName);
            }
            XmlTextWriter xmlTextWriter = null;

            try
            {
                xmlTextWriter            = new XmlTextWriter(xmlName, Encoding.UTF8);
                xmlTextWriter.Formatting = Formatting.Indented;
                xmlTextWriter.WriteStartDocument();
                foreach (SingleHashTable singleHashTable in hashTable)
                {
                    if (singleHashTable.Value != null)
                    {
                        xmlTextWriter.WriteElementString(singleHashTable.Key.ToString(), singleHashTable.Value.ToString());
                    }
                    else
                    {
                        if (singleHashTable.Key.ToString() == "End")
                        {
                            xmlTextWriter.WriteEndElement();
                        }
                        else
                        {
                            xmlTextWriter.WriteStartElement(singleHashTable.Key.ToString());
                        }
                    }
                }
                xmlTextWriter.WriteEndDocument();
            }
            catch (Exception ex)
            {
                PromptOccurPlace  promptOccurPlace  = PromptOccurPlace.XmlWriteError;
                PromptMessageType promptMessageType = PromptMessageType.Null;
                if (ex is IOException)
                {
                    promptMessageType = PromptMessageType.IOException;
                }
                else if (ex is UnauthorizedAccessException)
                {
                    promptMessageType = PromptMessageType.UnauthorizedAccessException;
                }
                else if (ex is NullReferenceException)
                {
                    promptMessageType = PromptMessageType.NullReferenceException;
                }
                else if (ex is SecurityException)
                {
                    promptMessageType = PromptMessageType.SecurityException;
                }
                else
                {
                    promptMessageType = PromptMessageType.UnKnown;
                }
                ErrorMessage.SetErrorMessage(promptOccurPlace, promptMessageType, Path.GetFileName(xmlName));
            }
            finally
            {
                if (xmlTextWriter != null)
                {
                    xmlTextWriter.Flush();
                    xmlTextWriter.Close();
                    xmlTextWriter = null;
                }
            }
        }