/// <summary> /// 接口实现 /// 解析消息基类XML /// </summary> public void ParserXml(string filePath, bool isOneFile = false) { XmlDocument doc = new XmlDocument(); doc.Load(filePath); AllBaseCmdFileData targetFileData = new AllBaseCmdFileData(); //文件名 XmlNode fileNameNode = doc.SelectSingleNode(NetCmdXmlParser.fileNameNodeStr); targetFileData.mClassName = fileNameNode.InnerText; //文件描述 XmlNode commentNode = doc.SelectSingleNode(baseCmdDesNodeStr); targetFileData.mDescribe = commentNode.InnerText; //父类 XmlNode fatherNode = doc.SelectSingleNode(baseCmdFatherNodeStr); targetFileData.mFatherName = fatherNode.InnerText; //协议消息名 XmlNode gscmd = doc.SelectSingleNode(baseCmdGscmdNodeStr); targetFileData.mGsCmd = gscmd.InnerText; //消息值 XmlNode num = doc.SelectSingleNode(baseCmdNumNodeStr); targetFileData.mNum = num.InnerText; //是否导出C# XmlNode isCS = doc.SelectSingleNode(baseCmdIsNeedCNodeStr); if (isCS == null) { targetFileData.mIsCS = true; } else { targetFileData.mIsCS = isCS.InnerText == "true" ? true : false; } //是否导出C# XmlNode isLua = doc.SelectSingleNode(baseCmdIsNeedLuaNodeStr); if (isLua == null) { targetFileData.mIsLua = true; } else { targetFileData.mIsLua = isLua.InnerText == "true" ? true : false; } //所有变量 XmlNode alldataNode = doc.SelectSingleNode(baseCmdNodeStr); if (alldataNode != null) { XmlNodeList alldataNodeList = alldataNode.ChildNodes; for (int i = 0; i < alldataNode.ChildNodes.Count; i++) { if (alldataNodeList[i].Name == baseCmdNodeNameStr) { XmlElement element = (XmlElement)alldataNodeList[i];; ParamData targetCmd = new ParamData(); targetCmd.mType = element.GetAttribute("type"); targetCmd.mName = element.GetAttribute("name"); targetCmd.mValue = element.GetAttribute("value"); targetCmd.mComment = element.GetAttribute("comment"); targetCmd.mStringLen = element.GetAttribute("strLen"); targetCmd.mArrayLen = element.GetAttribute("arrayLen"); targetCmd.ParseParamType(); targetFileData.mAllBaseCmdList.Add(targetCmd); } } } //解析并生成脚本 sWriteFile(targetFileData); //存入根消息数据,以便生成总的handle CmdHandlerFileTool.CmdBigTypeData bigType = new CmdHandlerFileTool.CmdBigTypeData(); bigType.mCmdClassName = targetFileData.mClassName; bigType.mCmdTypeName = targetFileData.mGsCmd; bigType.mIsCS = targetFileData.mIsCS; bigType.mIsLua = targetFileData.mIsLua; CmdHandlerFileTool.AddBigType(targetFileData.mClassName, bigType); }
//解析所有的 消息cmd的xml文件 public static void ParseAllCmdXml(string name = "") { CmdHandlerFileTool.CreateTypeDic(); string[] _fils = Directory.GetFiles(CmdXmlPath, "*.xml", SearchOption.AllDirectories); //获取当前工程下的所有xml foreach (string filePath in _fils) { if (filePath.EndsWith("xml")) { if (!string.IsNullOrEmpty(name)) { if (!filePath.EndsWith("\\" + name + ".xml")) { continue; } else { Debug.Log("找到文件了"); } } string targetFilePath = filePath.Replace("\\", "/"); string fileName = targetFilePath.Substring(targetFilePath.LastIndexOf("/") + 1); string filePreName = fileName.Substring(0, fileName.IndexOf("_")); //获取当前数据类型 ICmdXmlParser targetParser = null; if (filePreName == "Const") { targetParser = new ConstXmlParser(); } else if (filePreName == "Data") { targetParser = new DataXmlParser(); } else if (filePreName == "Enum") { targetParser = new EnumXmlParser(); } else if (filePreName == "Base") { targetParser = new BaseXmlParser(); } else if (filePreName == "Cmd") { targetParser = new CmdXmlParser(); } if (targetParser != null) { if (fileName.Contains("stMapDataMapScreenMobileClientCmd")) //这个协议复杂度过高,无法自动生成,忽略掉 { continue; } //解析当前文件 targetParser.ParserXml(filePath, !string.IsNullOrEmpty(name)); } } } //处理最后所有的 消息分发 写文件 if (string.IsNullOrEmpty(name)) { //创建总的handler文件 CmdHandlerFileTool.sWriteNetHandlerFile(); //创建lua的stNullClientCmd文件,其实不创建也可 StringBuilder file = new StringBuilder(); file.Append(LuaScriptParserTool.CreateNullClientCmd()); //创建消息根节点 string outFilePath_lua = NetCmdXmlParser.targetLuaFileBasePath + "/" + LuaScriptParserTool.CmdBaseDirectory + "/stNullClientCmd.lua"; NetCmdXmlParser.sWriteStringToFile(outFilePath_lua, file); } }
/// <summary> /// 接口实现 /// 解析消息XML /// </summary> public void ParserXml(string filePath, bool isOneFile = false) { XmlDocument doc = new XmlDocument(); doc.Load(filePath); CmdStructFileData targetFileData = new CmdStructFileData(); //文件名 XmlNode fileNameNode = doc.SelectSingleNode(NetCmdXmlParser.fileNameNodeStr); targetFileData.mClassName = fileNameNode.InnerText; //父类名 XmlNode fileFatherNameNode = doc.SelectSingleNode(cmdFatherDesNodeStr); targetFileData.mFatherClassName = fileFatherNameNode.InnerText; //文件名注释 XmlNode commentNode = doc.SelectSingleNode(cmdDesNodeStr); targetFileData.mDescribe = commentNode.InnerText; //协议消息名 XmlNode gscmd = doc.SelectSingleNode(cmdGsParamNodeStr); targetFileData.mGsParam = gscmd.InnerText; //自己消息ID XmlNode num = doc.SelectSingleNode(cmdNumNodeStr); targetFileData.mNum = num.InnerText; //父类消息ID XmlNode fathernum = doc.SelectSingleNode(cmdFatherNumNodeStr); if (fathernum == null) { Debug.LogError("父类消息值字段解析为空" + targetFileData.mClassName); } else { targetFileData.mFatherNum = fathernum.InnerText; } //路径文件夹名字 XmlNode pathname = doc.SelectSingleNode(cmdPathNameStr); if (pathname == null) { targetFileData.mPathName = ""; } else { targetFileData.mPathName = pathname.InnerText; } //是否需要解包 XmlNode isunpack = doc.SelectSingleNode(cmdIsUnPackNodeStr); targetFileData.mIsUnPack = isunpack.InnerText; //是否需要发包 XmlNode ispack = doc.SelectSingleNode(cmdIsPackNodeStr); targetFileData.mIsPack = ispack.InnerText; //是否需要Handler包 XmlNode ishandler = doc.SelectSingleNode(cmdIsHandlerNodeStr); if (ishandler == null) { targetFileData.mIsHandler = isunpack.InnerText; //不填默认看是否解包 } else { targetFileData.mIsHandler = ishandler.InnerText; } //是否需要lua XmlNode isneedlua = doc.SelectSingleNode(cmdIsNeedLuaNodeStr); targetFileData.mIsNeedLua = isneedlua.InnerText; //是否需要C XmlNode isneedc = doc.SelectSingleNode(cmdIsNeedCNodeStr); targetFileData.mIsNeedC = isneedc.InnerText; //常量 XmlNode cmdNode = doc.SelectSingleNode(cmdNodeStr); XmlNodeList cmdNodeList = cmdNode.ChildNodes; for (int i = 0; i < cmdNode.ChildNodes.Count; i++) { if (cmdNodeList[i].Name == cmdNodeNameStr) { XmlElement element = (XmlElement)cmdNodeList[i]; ParamData targetCmd = new ParamData(); targetCmd.mType = element.GetAttribute("type"); targetCmd.mName = element.GetAttribute("name"); targetCmd.mValue = element.GetAttribute("value"); targetCmd.mComment = element.GetAttribute("comment"); targetCmd.mStringLen = element.GetAttribute("strLen"); targetCmd.mArrayLen = element.GetAttribute("arrayLen"); targetCmd.mArrayDynLen = element.GetAttribute("arrayDymanicLen"); targetCmd.ParseParamType(); targetFileData.mCmdList.Add(targetCmd); } } bool isunpack_bool = false; bool ispack_bool = false; bool ishandler_bool = false; bool islua_bool = false; bool isc_bool = false; if (targetFileData.mIsUnPack == "true") { isunpack_bool = true; } if (targetFileData.mIsPack == "true") { ispack_bool = true; } if (targetFileData.mIsHandler == "true") { ishandler_bool = true; } if (targetFileData.mIsNeedC == "true") { isc_bool = true; } if (targetFileData.mIsNeedLua == "true") { islua_bool = true; } sWriteFile(isunpack_bool, ispack_bool, ishandler_bool, islua_bool, isc_bool, targetFileData); //存入数据,方便生成总的handle文件 if (ishandler_bool && !isOneFile) { if (isunpack_bool) { CmdHandlerFileTool.CmdSmallTypeData smallType = new CmdHandlerFileTool.CmdSmallTypeData(); smallType.mGsClassName = targetFileData.mClassName; smallType.mGsParamName = targetFileData.mGsParam; smallType.mIsCS = isc_bool; smallType.mIsLua = islua_bool; smallType.isNeedLua = islua_bool; CmdHandlerFileTool.CmdBigTypeData ownerBigType = CmdHandlerFileTool.GetBigType(targetFileData.mFatherClassName); ownerBigType.AddSubSmallType(smallType); } } }