You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

293 lines
8.2 KiB

  1. g_allXMLPostload = {}
  2. require("luaScript.Tools.XMLConfigOptimise")
  3. function runXMLPostload(Config)
  4. for i , v in pairs(g_allXMLPostload) do
  5. v(Config);
  6. end
  7. end
  8. -- 读取xml配置
  9. function loadXMLConfig(configDesc)
  10. local xmlPath
  11. if configDesc.XMLData == nil then
  12. xmlPath = "dataconfig/";
  13. -- 如果有lua文件,则用lua方式解析
  14. if cc.FilePackage:getInstance():isUsePackageFileSystem() then
  15. return loadLuaXMLConfig(configDesc.XMLFile , configDesc);
  16. else
  17. -- 读取转换成lua的配置文件
  18. local luaConfigFile = xmlPath .. configDesc.XMLFile .. ".lua";
  19. if cc.FileUtils:getInstance():isFileExist(luaConfigFile) then
  20. return loadLuaXMLConfig(luaConfigFile , configDesc);
  21. end
  22. end
  23. end
  24. local result = {}
  25. local XMLConfig = {}
  26. -- 重新载入所有配置
  27. function XMLConfig:reload()
  28. local newDatas = loadXMLConfig(configDesc);
  29. local oldResult = {}
  30. for i , v in pairs(result) do
  31. oldResult[i] = v
  32. end
  33. -- 删除所有
  34. for i , v in pairs(oldResult) do
  35. result[i] = nil;
  36. end
  37. -- 保存新的
  38. for i , v in pairs(newDatas) do
  39. result[i] = v
  40. end
  41. end
  42. function XMLConfig:getConfigDesc()
  43. return configDesc;
  44. end
  45. -- 获取值(不使用默认值)
  46. function XMLConfig:get(key)
  47. return rawget(self , key);
  48. end
  49. local xmlFile;
  50. local languageRoot;
  51. if configDesc.XMLData == nil then
  52. local xmlFileName = xmlPath .. configDesc.XMLFile;
  53. print("开始读取XML配置:" .. xmlFileName);
  54. xmlFile = xml.load(xmlFileName);
  55. else
  56. if configDesc.IsXMLObject then
  57. xmlFile = configDesc.XMLData
  58. else
  59. xmlFile = xml.eval(configDesc.XMLData);
  60. end
  61. end
  62. local root = xmlFile:find(configDesc.RootNode);
  63. -- 根据值的名称去计算一个值的类型,并以这个类型返回这个值
  64. local function getValue(name , value)
  65. if value == nil then
  66. return nil
  67. end
  68. local convertFunc = configDesc.Mapping[name];
  69. if convertFunc then
  70. return convertFunc(value);
  71. else
  72. return value;
  73. end
  74. end
  75. local keyName = configDesc.KeyName;
  76. local secondKeyName = configDesc.SecondKeyName;
  77. --local thirdKeyName = configDesc.ThirdKeyName;
  78. -- 读取所有配置
  79. for i , v in ipairs(root) do
  80. local valueTable = {}
  81. if keyName ~= nil then
  82. local key = getValue(keyName , v[keyName]);
  83. if key == nil then
  84. error("找不到第一键值:" .. keyName);
  85. end
  86. if secondKeyName then
  87. local secondKey = getValue(secondKeyName , v[secondKeyName]);
  88. if secondKey == nil then
  89. error("找不到第二键值:" .. secondKeyName);
  90. end
  91. local secondTable = result[key]
  92. if secondTable == nil then
  93. secondTable = {}
  94. result[key] = secondTable;
  95. local defaultKey = configDesc.DefaultSecondKey
  96. local function defaultData(self , k)
  97. if k == "get" then
  98. return function(self , secondKey)
  99. return rawget(self , secondKey);
  100. end
  101. else
  102. if defaultKey then
  103. print("找不到配置[" .. configDesc.XMLFile .. "]键为[" .. tostring(key) .. "][" .. tostring(secondKey) .. "]的值,将使用默认键[" .. tostring(key) .. "][" .. tostring(defaultKey) .. "]代替")
  104. return self[defaultKey]
  105. else
  106. return nil;
  107. end
  108. end
  109. end
  110. -- 默认值用metatable来返回
  111. setmetatable(secondTable , {__index=defaultData})
  112. end
  113. --[[-- 第三个关键字
  114. if thirdKeyName then
  115. local thirdKey = getValue(thirdKeyName , v[thirdKeyName]);
  116. if thirdKey == nil then
  117. error("找不到第三键值:" .. thirdKeyName);
  118. end
  119. local thirdTable = result[key][secondKey]
  120. if thirdTable == nil then
  121. thirdTable = {}
  122. result[key][secondKey] = thirdTable;
  123. local defaultKey = configDesc.DefaultThirdKey
  124. local function defaultData(self , k)
  125. if k == "get" then
  126. return function(self , thirdKey)
  127. return rawget(self , thirdKey);
  128. end
  129. else
  130. print("找不到配置[" .. configDesc.XMLFile .. "]键为[" .. tostring(key) .. "][" .. tostring(secondKey) .. "][" .. tostring(k) .. "]的值,将使用默认键[" .. tostring(key) .. "][" .. tostring(secondKey) .. "][" .. tostring(defaultKey) .. "]代替")
  131. return self[defaultKey]
  132. end
  133. end
  134. -- 默认值用metatable来返回
  135. setmetatable(thirdTable , {__index=defaultData})
  136. end
  137. thirdTable[thirdKey] = valueTable;
  138. else--]]
  139. secondTable[secondKey] = valueTable;
  140. --end
  141. else
  142. result[key] = valueTable;
  143. end
  144. else
  145. table.insert(result , valueTable);
  146. end
  147. for ii , vv in pairs(v) do
  148. if type(ii) == "string" then
  149. valueTable[ii] = getValue(ii , vv);
  150. end
  151. end
  152. -- 生成语言字段
  153. if languageRoot then
  154. local row = languageRoot[i];
  155. if row then
  156. for ii , vv in pairs(row) do
  157. if type(ii) == "string" then
  158. valueTable[ii] = getValue(ii , vv);
  159. end
  160. end
  161. end
  162. end
  163. end
  164. local defaultKey = configDesc.DefaultKey
  165. local secondDefaultKey = configDesc.DefaultSecondKey
  166. if defaultKey ~= nil then
  167. -- 检查默认值
  168. if result[defaultKey] == nil then
  169. error("找不到配置[" .. configDesc.XMLFile .. "]的默认值[" .. defaultKey .. "]")
  170. return;
  171. end
  172. if secondKeyName then
  173. local secondTable = result[defaultKey];
  174. local secondKey = getValue(secondKeyName , secondTable[secondDefaultKey][secondKeyName]);
  175. -- 检查默认值
  176. if result[defaultKey][secondKey] == nil then
  177. error("找不到配置[" .. configDesc.XMLFile .. "]的第二默认值[" .. defaultKey .. "][" .. secondKey .."]")
  178. return;
  179. end
  180. end
  181. --[[if thirdKeyName and secondKeyName then
  182. local thirdTable = result[defaultKey][secondDefaultKey];
  183. local thirdKey = getValue(thirdKeyName , thirdTable[configDesc.DefaultThirdKey][thirdKeyName]);
  184. -- 检查默认值
  185. if result[defaultKey][secondKey][thirdKey] == nil then
  186. error("找不到配置[" .. configDesc.XMLFile .. "]的第三默认值[" .. defaultKey .. "][" .. secondKey .."][" .. thirdKey .."]")
  187. return;
  188. end
  189. end--]]
  190. local function defaultData(self , key)
  191. if XMLConfig[key] then
  192. return XMLConfig[key]
  193. else
  194. print("找不到配置[" .. configDesc.XMLFile .. "]键为[" .. tostring(key) .. "]的值,将使用默认键[" .. tostring(defaultKey) .. "]代替")
  195. return self[defaultKey]
  196. end
  197. end
  198. -- 默认值用metatable来返回
  199. setmetatable(result , {__index=defaultData})
  200. else
  201. local function defaultData(self , key)
  202. if XMLConfig[key] then
  203. return XMLConfig[key]
  204. end
  205. end
  206. -- 默认值用metatable来返回
  207. setmetatable(result , {__index=defaultData})
  208. end
  209. if configDesc.postload then
  210. table.insert(g_allXMLPostload , configDesc.postload)
  211. end
  212. --print("读取XML配置成功:" .. configDesc.XMLFile);
  213. return result
  214. end
  215. -- 从XML节点载入一个Node,并返回此Node
  216. local function createFromXmlNode(cls , xmlNode)
  217. local instance = cls:createNode()
  218. if app.editor then
  219. if instance.loadDefaults then
  220. instance:loadDefaults()
  221. end
  222. end
  223. instance:loadFromXmlNode(xmlNode);
  224. return instance;
  225. end
  226. -- 从XML节点实例载入一颗Node树,并返回根Node
  227. function createNodeFromXmlNode(xmlNode)
  228. local cls = cc[xmlNode.ClassName];
  229. if not cls then
  230. error("找不到类型:" .. xmlNode.ClassName);
  231. end
  232. local node = createFromXmlNode(cls , xmlNode);
  233. local children = xmlNode.Children;
  234. if children then
  235. for i , v in ipairs(children) do
  236. node:addChild(createNodeFromXmlNode(v));
  237. end
  238. end
  239. return node;
  240. end
  241. -- 从XML文件载入一颗Node树,并返回根Node
  242. function createNodeFromFile(nodeFile)
  243. TimeSpan:enterSpan("createNodeFromFile" .. nodeFile);
  244. --TimeSpan:enterSpan("table.loadFile");
  245. local xmlFile = table.loadFile(nodeFile);
  246. --TimeSpan:leaveSpan();
  247. --TimeSpan:enterSpan("createNodeFromXmlNode");
  248. local node = createNodeFromXmlNode(xmlFile);
  249. --TimeSpan:leaveSpan();
  250. TimeSpan:leaveSpan();
  251. return node;
  252. end
  253. -- 从XML文件载入一颗Node树,并返回根Node
  254. function createNodeFromXmlString(xmlString)
  255. local data = table.loadString(xmlString);
  256. local node = createNodeFromXmlNode(data);
  257. return node;
  258. end
  259. --g_xmlFileCache = {};
  260. -- 载入XML文件,并缓存XML数据
  261. function loadXmlFileWithCache(effectFile)
  262. --local xmlData = g_xmlFileCache[effectFile]
  263. --if xmlData then
  264. -- return xmlData;
  265. --end
  266. xmlData = xml.load(effectFile);
  267. --g_xmlFileCache[effectFile] = xmlData;
  268. return xmlData;
  269. end