public Protocol Parse(string packet_file)
        {
            XmlDocument doc = new XmlDocument();
            doc.Load(packet_file);

            Protocol protocol = new Protocol();
            XmlNode protocol_node = doc.SelectSingleNode("/Protocol");
            protocol.name = protocol_node.Attributes["name"].InnerText;
            protocol.number = int.Parse(protocol_node.Attributes["number"].InnerText);
            protocol.version = int.Parse(protocol_node.Attributes["version"].InnerText);


            /// Using
            XmlNodeList using_list = protocol_node.SelectNodes("Import");
            foreach (XmlNode node in using_list)
            {
                Import import = new Import();
                import.name = node.Attributes["name"].InnerText;

                protocol.import_list.Add(import);
            }


            /// FLAG
            XmlNodeList flag_list = protocol_node.SelectNodes("Flag");
            foreach (XmlNode node in flag_list)
            {
                Flag flag = new Flag();
                flag.name = node.Attributes["name"].InnerText;
                flag.value = int.Parse(node.Attributes["value"].InnerText);
                if (node.Attributes["desc"] != null)
                    flag.desc = node.Attributes["desc"].InnerText;
                else
                    flag.desc = "";

                protocol.flag_list.Add(flag);
            }

            /// Message
            XmlNodeList message_list = protocol_node.SelectNodes("Message");
            UInt32 last_id = 0;
            foreach (XmlNode node in message_list)
            {
                Message message = new Message();
                message.name = node.Attributes["name"].InnerText;
                if (node.Attributes["id"] == null)
                {
                    message.id = ++last_id;
                }
                else
                {
                    message.id = UInt32.Parse(node.Attributes["id"].InnerText);
                    last_id = message.id;
                }

                XmlNodeList data_list = node.SelectNodes("Data");
                foreach (XmlNode data_node in data_list)
                {
                    Data data = new Data();
                    data.type = data_node.Attributes["type"].InnerText;
                    data.name = data_node.Attributes["name"].InnerText;
                    if (data_node.Attributes["array"] != null)
                        data.array = int.Parse(data_node.Attributes["array"].InnerText);
                    else
                        data.array = 0;
                    if (data_node.Attributes["desc"] != null)
                        data.desc = data_node.Attributes["desc"].InnerText;
                    else
                        data.desc = "";

                    message.data_list.Add(data);
                }

                protocol.message_list.Add(message);
            }

            return protocol;
        }
        public Protocol Parse(string packet_file)
        {
            XmlDocument doc = new XmlDocument();

            doc.Load(packet_file);

            Protocol protocol      = new Protocol();
            XmlNode  protocol_node = doc.SelectSingleNode("/Protocol");

            protocol.name    = protocol_node.Attributes["name"].InnerText;
            protocol.number  = int.Parse(protocol_node.Attributes["number"].InnerText);
            protocol.version = int.Parse(protocol_node.Attributes["version"].InnerText);


            /// Using
            XmlNodeList using_list = protocol_node.SelectNodes("Import");

            foreach (XmlNode node in using_list)
            {
                Import import = new Import();
                import.name = node.Attributes["name"].InnerText;

                protocol.import_list.Add(import);
            }


            /// FLAG
            XmlNodeList flag_list = protocol_node.SelectNodes("Flag");

            foreach (XmlNode node in flag_list)
            {
                Flag flag = new Flag();
                flag.name  = node.Attributes["name"].InnerText;
                flag.value = int.Parse(node.Attributes["value"].InnerText);
                if (node.Attributes["desc"] != null)
                {
                    flag.desc = node.Attributes["desc"].InnerText;
                }
                else
                {
                    flag.desc = "";
                }

                protocol.flag_list.Add(flag);
            }

            /// Message
            XmlNodeList message_list = protocol_node.SelectNodes("Message");
            UInt32      last_id      = 0;

            foreach (XmlNode node in message_list)
            {
                Message message = new Message();
                message.name = node.Attributes["name"].InnerText;
                if (node.Attributes["id"] == null)
                {
                    message.id = ++last_id;
                }
                else
                {
                    message.id = UInt32.Parse(node.Attributes["id"].InnerText);
                    last_id    = message.id;
                }

                XmlNodeList data_list = node.SelectNodes("Data");
                foreach (XmlNode data_node in data_list)
                {
                    Data data = new Data();
                    data.type = data_node.Attributes["type"].InnerText;
                    data.name = data_node.Attributes["name"].InnerText;
                    if (data_node.Attributes["array"] != null)
                    {
                        data.array = int.Parse(data_node.Attributes["array"].InnerText);
                    }
                    else
                    {
                        data.array = 0;
                    }
                    if (data_node.Attributes["desc"] != null)
                    {
                        data.desc = data_node.Attributes["desc"].InnerText;
                    }
                    else
                    {
                        data.desc = "";
                    }

                    message.data_list.Add(data);
                }

                protocol.message_list.Add(message);
            }

            return(protocol);
        }