PackageHelper.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648
  1. using System;
  2. using System.Configuration;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Xml;
  6. using System.Xml.Linq;
  7. using Abp.Runtime.Caching;
  8. using Abp.UI;
  9. using IwbZero.IwbBase;
  10. using IwbZero.ToolCommon;
  11. using IwbZero.ToolCommon.LogHelpers;
  12. using IwbZero.ToolCommon.StringModel;
  13. using WeEngine.CommonDto.WeInfo;
  14. using WeEngine.ComponentInfo;
  15. namespace WeEngine
  16. {
  17. public static class PackageHelper
  18. {
  19. private static readonly string PackageBasePath = $"{WeEngineConst.DataFileBasePath}Packages/";
  20. #region 方案包
  21. /// <summary>
  22. /// 查询方案包
  23. /// </summary>
  24. /// <param name="cacheManager"></param>
  25. /// <param name="packageId"></param>
  26. /// <returns></returns>
  27. public static IwbXmlNode GetPackageXml(this ICacheManager cacheManager, string packageId)
  28. {
  29. var xml = cacheManager.GetCache(EngineCacheName.Package).Get(packageId, () => GetPackageXmlById(packageId));
  30. return xml;
  31. }
  32. /// <summary>
  33. /// 查询方案包
  34. /// </summary>
  35. /// <param name="packageId"></param>
  36. /// <returns></returns>
  37. public static IwbXmlNode GetPackageXmlById(string packageId)
  38. {
  39. var path = $"{PackageBasePath}{packageId}/";
  40. var fileName = $"{path}Package.iwbx";
  41. var xDoc = new XmlDocument();
  42. if (Directory.Exists(path) && File.Exists(fileName))
  43. {
  44. return GetPackageXmlFromFile(packageId);
  45. }
  46. try
  47. {
  48. //访问数据中心获取
  49. string baseUrl = ConfigurationManager.AppSettings["DataCenter.Platform.BaseUrl"] ?? "http://shvber.com:5015/";
  50. string apiUrl = ConfigurationManager.AppSettings["DataCenter.Engine.PackageUrl"] ?? "api/services/WePlatform/WePackage/GetPackageXml";
  51. string url=$"{baseUrl.Ew("/")}{apiUrl}?no={packageId}";
  52. string authKey = ConfigurationManager.AppSettings["DataCenter.Engine.AuthKey"];
  53. string result = url.RequestPost(new { PackageNo = packageId }.Obj2String(), authKey);
  54. WePackageXmlDto xmlDto = result.Str2Obj<WePackageXmlDto>();
  55. if (!Directory.Exists(path))
  56. {
  57. Directory.CreateDirectory(path);
  58. }
  59. if (xmlDto.FlowXml.IsNotEmpty())
  60. {
  61. xDoc.InnerXml = xmlDto.FlowXml;
  62. xDoc.Save($"{path}flow.iwbx");
  63. }
  64. if (xmlDto.SceneXml.IsNotEmpty())
  65. {
  66. xDoc.InnerXml = xmlDto.SceneXml;
  67. xDoc.Save($"{path}scene.iwbx");
  68. }
  69. if (xmlDto.BehaviorXml.IsNotEmpty())
  70. {
  71. xDoc.InnerXml = xmlDto.BehaviorXml;
  72. xDoc.Save($"{path}behavior.iwbx");
  73. }
  74. if (xmlDto.ComponentXml.IsNotEmpty())
  75. {
  76. xDoc.InnerXml = xmlDto.ComponentXml;
  77. xDoc.Save($"{path}component.iwbx");
  78. }
  79. if (xmlDto.GuideXml.IsNotEmpty())
  80. {
  81. xDoc.InnerXml = xmlDto.GuideXml;
  82. xDoc.Save($"{path}guide.iwbx");
  83. }
  84. if (xmlDto.EnvironResourceXml.IsNotEmpty())
  85. {
  86. xDoc.InnerXml = xmlDto.EnvironResourceXml;
  87. xDoc.Save($"{path}environment.iwbx");
  88. }
  89. IwbXmlNode iwbNode = null;
  90. if (xmlDto.PackageXml.IsNotEmpty())
  91. {
  92. xDoc.InnerXml = xmlDto.PackageXml;
  93. xDoc.Save($"{path}package.iwbx");
  94. iwbNode = IwbXmlNode.ParseGenericXml(xmlDto.PackageXml);
  95. }
  96. return iwbNode;
  97. }
  98. catch (Exception e)
  99. {
  100. typeof(PackageHelper).LogError(e);
  101. throw new UserFriendlyException("方案包获取、解析失败!");
  102. }
  103. }
  104. /// <summary>
  105. /// 从文件加载方案包
  106. /// </summary>
  107. /// <param name="packageId"></param>
  108. /// <returns></returns>
  109. public static IwbXmlNode GetPackageXmlFromFile(string packageId)
  110. {
  111. string fileName = $"{PackageBasePath}{packageId}/package.iwbx";
  112. if (!File.Exists(fileName))
  113. {
  114. return null;
  115. }
  116. try
  117. {
  118. var xDoc = new XmlDocument();
  119. xDoc.Load(fileName);
  120. var iwbNode = IwbXmlNode.ParseGenericXml(xDoc.InnerXml);
  121. return iwbNode;
  122. }
  123. catch (Exception e)
  124. {
  125. typeof(PackageHelper).LogError(e);
  126. throw new UserFriendlyException("方案包解析失败!");
  127. }
  128. }
  129. #endregion
  130. #region 情景流
  131. /// <summary>
  132. /// 加载情景流
  133. /// </summary>
  134. /// <param name="cacheManager"></param>
  135. /// <param name="packageId"></param>
  136. /// <param name="flowNo"></param>
  137. /// <returns></returns>
  138. public static IwbXmlNode GetSceneFlowXml(this ICacheManager cacheManager, string packageId, string flowNo)
  139. {
  140. var xml = cacheManager.GetCache(EngineCacheName.EngineSceneFlowCache).Get($"{packageId}.{flowNo}", () => GetSceneFlowXmlFromFile(packageId, flowNo));
  141. return xml;
  142. }
  143. /// <summary>
  144. /// 从文件加载情景流
  145. /// </summary>
  146. /// <param name="packageId"></param>
  147. /// <param name="flowNo"></param>
  148. /// <returns></returns>
  149. public static IwbXmlNode GetSceneFlowXmlFromFile(string packageId, string flowNo)
  150. {
  151. string fileName = $"{PackageBasePath}{packageId}/flow.iwbx";
  152. if (!File.Exists(fileName))
  153. {
  154. return null;
  155. }
  156. var xDoc = XDocument.Load(fileName);
  157. var root = xDoc.Root;
  158. var flow = root != null && root.HasElements
  159. ? (from e in root.Elements("SceneFlow") where e.Attribute("id")?.Value == flowNo select e).FirstOrDefault()
  160. : null;
  161. if (flow == null)
  162. {
  163. return null;
  164. }
  165. //var xmlDoc= new XmlDocument();
  166. //xmlDoc.LoadXml(flow.ToString());
  167. //XmlNode xmlNode = xmlDoc.FirstChild;
  168. var iwbNode = IwbXmlNode.ParseGenericXml(flow.ToString());
  169. return iwbNode;
  170. }
  171. /// <summary>
  172. /// 从xml字符串中加载情景流
  173. /// </summary>
  174. /// <param name="xml"></param>
  175. /// <param name="flowNo"></param>
  176. /// <returns></returns>
  177. public static IwbXmlNode GetSceneFlowXmlFromXml(string xml, string flowNo)
  178. {
  179. if (xml.IsEmpty())
  180. {
  181. return null;
  182. }
  183. var xDoc = XDocument.Parse(xml);
  184. var root = xDoc.Root;
  185. var flow = root != null && root.HasElements
  186. ? (from e in root.Elements("SceneFlow") where e.Attribute("id")?.Value == flowNo select e).FirstOrDefault()
  187. : null;
  188. if (flow == null)
  189. {
  190. return null;
  191. }
  192. //var xmlDoc= new XmlDocument();
  193. //xmlDoc.LoadXml(flow.ToString());
  194. //XmlNode xmlNode = xmlDoc.FirstChild;
  195. var iwbNode = IwbXmlNode.ParseGenericXml(flow.ToString());
  196. return iwbNode;
  197. }
  198. #endregion
  199. #region 情景
  200. /// <summary>
  201. /// 加载情景
  202. /// </summary>
  203. /// <param name="cacheManager"></param>
  204. /// <param name="packageId"></param>
  205. /// <param name="sceneNo"></param>
  206. /// <returns></returns>
  207. public static IwbXmlNode GetSceneInfoXml(this ICacheManager cacheManager, string packageId, string sceneNo)
  208. {
  209. var xml = cacheManager.GetCache(EngineCacheName.EngineSceneInfoCache).Get($"{packageId}.{sceneNo}", () => GetSceneXmlFromFile(packageId, sceneNo));
  210. return xml;
  211. }
  212. /// <summary>
  213. /// 从文件加载情景
  214. /// </summary>
  215. /// <param name="packageId"></param>
  216. /// <param name="sceneNo"></param>
  217. /// <returns></returns>
  218. public static IwbXmlNode GetSceneXmlFromFile(string packageId, string sceneNo)
  219. {
  220. string fileName = $"{PackageBasePath}{packageId}/scene.iwbx";
  221. if (!File.Exists(fileName))
  222. {
  223. return null;
  224. }
  225. var xDoc = XDocument.Load(fileName);
  226. var root = xDoc.Root;
  227. var scene = root != null && root.HasElements
  228. ? (from e in root.Elements("SceneInfo") where e.Attribute("id")?.Value == sceneNo select e).FirstOrDefault()
  229. : null;
  230. if (scene == null)
  231. {
  232. return null;
  233. }
  234. //var xmlDoc = new XmlDocument();
  235. //xmlDoc.LoadXml(scene.ToString());
  236. //XmlNode xmlNode = xmlDoc.FirstChild;
  237. //return xmlNode;
  238. var iwbNode = IwbXmlNode.ParseGenericXml(scene.ToString());
  239. return iwbNode;
  240. }
  241. /// <summary>
  242. /// 从xml加载情景
  243. /// </summary>
  244. /// <param name="xml"></param>
  245. /// <param name="sceneNo"></param>
  246. /// <returns></returns>
  247. public static IwbXmlNode GetSceneXmlFromXml(string xml, string sceneNo)
  248. {
  249. if (xml.IsEmpty())
  250. {
  251. return null;
  252. }
  253. var xDoc = XDocument.Parse(xml);
  254. var root = xDoc.Root;
  255. var scene = root != null && root.HasElements
  256. ? (from e in root.Elements("SceneInfo") where e.Attribute("id")?.Value == sceneNo select e).FirstOrDefault()
  257. : null;
  258. if (scene == null)
  259. {
  260. return null;
  261. }
  262. //var xmlDoc = new XmlDocument();
  263. //xmlDoc.LoadXml(scene.ToString());
  264. //XmlNode xmlNode = xmlDoc.FirstChild;
  265. //return xmlNode;
  266. var iwbNode = IwbXmlNode.ParseGenericXml(scene.ToString());
  267. return iwbNode;
  268. }
  269. #endregion
  270. #region 行为
  271. /// <summary>
  272. /// 加载处理行为
  273. /// </summary>
  274. /// <param name="cacheManager"></param>
  275. /// <param name="packageId"></param>
  276. /// <param name="behaviorNo"></param>
  277. /// <returns></returns>
  278. public static IwbXmlNode GetBehaviorXml(this ICacheManager cacheManager, string packageId, string behaviorNo)
  279. {
  280. var xml = cacheManager.GetCache(EngineCacheName.EngineBehaviorCache).Get($"{packageId}.{behaviorNo}", () => GetBehaviorXmlFromFile(packageId, behaviorNo));
  281. return xml;
  282. }
  283. /// <summary>
  284. /// 从文件加载处理行为
  285. /// </summary>
  286. /// <param name="packageId"></param>
  287. /// <param name="behaviorNo"></param>
  288. /// <returns></returns>
  289. public static IwbXmlNode GetBehaviorXmlFromFile(string packageId, string behaviorNo)
  290. {
  291. string fileName = $"{PackageBasePath}{packageId}/behavior.iwbx";
  292. if (!File.Exists(fileName))
  293. {
  294. return null;
  295. }
  296. var xDoc = XDocument.Load(fileName);
  297. var root = xDoc.Root;
  298. var behavior = root != null && root.HasElements
  299. ? (from e in root.Elements("Behavior") where e.Attribute("id")?.Value == behaviorNo select e).FirstOrDefault()
  300. : null;
  301. if (behavior == null)
  302. {
  303. return null;
  304. }
  305. var iwbNode = IwbXmlNode.ParseGenericXml(behavior.ToString());
  306. return iwbNode;
  307. }
  308. /// <summary>
  309. /// 从xml加载处理行为
  310. /// </summary>
  311. /// <param name="xml"></param>
  312. /// <param name="behaviorNo"></param>
  313. /// <returns></returns>
  314. public static IwbXmlNode GetBehaviorXmlFromXml(string xml, string behaviorNo)
  315. {
  316. if (xml.IsEmpty())
  317. {
  318. return null;
  319. }
  320. var xDoc = XDocument.Parse(xml);
  321. var root = xDoc.Root;
  322. var behavior = root != null && root.HasElements
  323. ? (from e in root.Elements("Behavior") where e.Attribute("id")?.Value == behaviorNo select e).FirstOrDefault()
  324. : null;
  325. if (behavior == null)
  326. {
  327. return null;
  328. }
  329. var iwbNode = IwbXmlNode.ParseGenericXml(behavior.ToString());
  330. return iwbNode;
  331. }
  332. #endregion
  333. #region 引导信息
  334. /// <summary>
  335. /// 加载引导信息
  336. /// </summary>
  337. /// <param name="cacheManager"></param>
  338. /// <param name="packageId"></param>
  339. /// <param name="guideNo"></param>
  340. /// <returns></returns>
  341. public static IwbXmlNode GetGuideXml(this ICacheManager cacheManager, string packageId, string guideNo)
  342. {
  343. var xml = cacheManager.GetCache(EngineCacheName.EngineGuideCache).Get($"{packageId}.{guideNo}", () => GetGuideXmlFromFile(packageId, guideNo));
  344. return xml;
  345. }
  346. /// <summary>
  347. /// 从文件加载引导信息
  348. /// </summary>
  349. /// <param name="packageId"></param>
  350. /// <param name="guideNos"></param>
  351. /// <returns></returns>
  352. public static IwbXmlNode GetGuidesXmlFromFile(string packageId, string guideNos)
  353. {
  354. string xmlStr = "";
  355. foreach (var guideNo in guideNos.StrToArray())
  356. {
  357. xmlStr += GetGuideStrXmlFromFile(packageId, guideNo);
  358. }
  359. if (xmlStr.IsEmpty())
  360. {
  361. return null;
  362. }
  363. xmlStr = $"<Guides>{xmlStr}</Guides>";
  364. var iwbNode = IwbXmlNode.ParseGenericXml(xmlStr);
  365. return iwbNode;
  366. }
  367. /// <summary>
  368. /// 从文件加载引导信息
  369. /// </summary>
  370. /// <param name="packageId"></param>
  371. /// <param name="guideNo"></param>
  372. /// <returns></returns>
  373. public static IwbXmlNode GetGuideXmlFromFile(string packageId, string guideNo)
  374. {
  375. string xmlStr = GetGuideStrXmlFromFile(packageId, guideNo);
  376. var iwbNode = IwbXmlNode.ParseGenericXml(xmlStr);
  377. return iwbNode;
  378. }
  379. /// <summary>
  380. /// 从文件加载引导信息
  381. /// </summary>
  382. /// <param name="packageId"></param>
  383. /// <param name="guideNo"></param>
  384. /// <returns></returns>
  385. public static string GetGuideStrXmlFromFile(string packageId, string guideNo)
  386. {
  387. string fileName = $"{PackageBasePath}{packageId}/guide.iwbx";
  388. if (!File.Exists(fileName))
  389. return null;
  390. var xDoc = XDocument.Load(fileName);
  391. var root = xDoc.Root;
  392. var guide = root != null && root.HasElements
  393. ? (from e in root.Elements("GuideInfo") where e.Attribute("id")?.Value == guideNo select e).FirstOrDefault()
  394. : null;
  395. return guide?.ToString() ?? "";
  396. }
  397. /// <summary>
  398. /// 从xml加载引导信息
  399. /// </summary>
  400. /// <param name="xml"></param>
  401. /// <param name="guideNo"></param>
  402. /// <returns></returns>
  403. public static IwbXmlNode GetGuidesXmlFromXml(string xml, string guideNo)
  404. {
  405. if (xml.IsEmpty())
  406. {
  407. return null;
  408. }
  409. var xDoc = XDocument.Parse(xml);
  410. var root = xDoc.Root;
  411. var guide = root != null && root.HasElements
  412. ? (from e in root.Elements("GuideInfo") where e.Attribute("id")?.Value == guideNo select e).FirstOrDefault()
  413. : null;
  414. if (guide == null)
  415. {
  416. return null;
  417. }
  418. var iwbNode = IwbXmlNode.ParseGenericXml(guide.ToString());
  419. return iwbNode;
  420. }
  421. #endregion
  422. #region 环境资源
  423. /// <summary>
  424. /// 加载环境资源信息
  425. /// </summary>
  426. /// <param name="cacheManager"></param>
  427. /// <param name="packageId"></param>
  428. /// <param name="resourceNo"></param>
  429. /// <returns></returns>
  430. public static IwbXmlNode GetEnvironResourceXml(this ICacheManager cacheManager, string packageId, string resourceNo)
  431. {
  432. var xml = cacheManager.GetCache(EngineCacheName.EngineEnvironResourceCache).Get($"{packageId}.{resourceNo}", () => GetEnvironResourceXmlFromFile(packageId, resourceNo));
  433. return xml;
  434. }
  435. /// <summary>
  436. /// 从文件加载环境资源信息
  437. /// </summary>
  438. /// <param name="packageId"></param>
  439. /// <param name="resourceNos"></param>
  440. /// <returns></returns>
  441. public static IwbXmlNode GetEnvironResourcesXmlFromFile(string packageId, string resourceNos)
  442. {
  443. string xmlStr = "";
  444. foreach (var no in resourceNos.StrToArray())
  445. {
  446. xmlStr += GetEnvironResourceXmlFromFile(packageId, no);
  447. }
  448. if (xmlStr.IsEmpty())
  449. {
  450. return null;
  451. }
  452. xmlStr = $"<Environments>{xmlStr}</Environments>";
  453. //var xmlDoc= new XmlDocument();
  454. //xmlDoc.LoadXml(xmlStr);
  455. //XmlNode xmlNode = xmlDoc.FirstChild;
  456. //return xmlNode;
  457. var iwbNode = IwbXmlNode.ParseGenericXml(xmlStr);
  458. return iwbNode;
  459. }
  460. /// <summary>
  461. /// 从文件加载环境资源信息
  462. /// </summary>
  463. /// <param name="packageId"></param>
  464. /// <param name="resourceNo"></param>
  465. /// <returns></returns>
  466. public static IwbXmlNode GetEnvironResourceXmlFromFile(string packageId, string resourceNo)
  467. {
  468. string xmlStr = GetEnvironResourceStrXmlFromFile(packageId, resourceNo);
  469. //var xmlDoc= new XmlDocument();
  470. //xmlDoc.LoadXml(xmlStr);
  471. //XmlNode xmlNode = xmlDoc.FirstChild;
  472. //return xmlNode;
  473. var iwbNode = IwbXmlNode.ParseGenericXml(xmlStr);
  474. return iwbNode;
  475. }
  476. /// <summary>
  477. /// 从文件加载环境资源信息
  478. /// </summary>
  479. /// <param name="packageId"></param>
  480. /// <param name="resourceNo"></param>
  481. /// <returns></returns>
  482. public static string GetEnvironResourceStrXmlFromFile(string packageId, string resourceNo)
  483. {
  484. string fileName = $"{PackageBasePath}{packageId}/environment.iwbx";
  485. if (!File.Exists(fileName))
  486. return null;
  487. var xDoc = XDocument.Load(fileName);
  488. var root = xDoc.Root;
  489. var resource = root != null && root.HasElements
  490. ? (from e in root.Elements("Environment") where e.Attribute("id")?.Value == resourceNo select e).FirstOrDefault()
  491. : null;
  492. return resource?.ToString() ?? "";
  493. }
  494. /// <summary>
  495. /// 从xml加载环境资源信息
  496. /// </summary>
  497. /// <param name="xml"></param>
  498. /// <param name="resourceNo"></param>
  499. /// <returns></returns>
  500. public static IwbXmlNode GetEnvironResourceXmlFromXml(string xml, string resourceNo)
  501. {
  502. if (xml.IsEmpty())
  503. {
  504. return null;
  505. }
  506. var xDoc = XDocument.Parse(xml);
  507. var root = xDoc.Root;
  508. var resource = root != null && root.HasElements
  509. ? (from e in root.Elements("Environment") where e.Attribute("id")?.Value == resourceNo select e).FirstOrDefault()
  510. : null;
  511. if (resource == null)
  512. {
  513. return null;
  514. }
  515. var iwbNode = IwbXmlNode.ParseGenericXml(resource.ToString());
  516. return iwbNode;
  517. }
  518. #endregion
  519. #region 事务组件
  520. /// <summary>
  521. /// 加载事务组件
  522. /// </summary>
  523. /// <param name="cacheManager"></param>
  524. /// <param name="packageId"></param>
  525. /// <param name="compId"></param>
  526. /// <returns></returns>
  527. public static EngineComponent GetEngineComponent(this ICacheManager cacheManager, string packageId, string compId)
  528. {
  529. var key = packageId.IsEmpty() ? compId : $"{packageId}.{compId}";
  530. var component = cacheManager.GetCache(EngineCacheName.EngineComponentCache).Get(key, () => GetEngineComponent(packageId, compId));
  531. return component;
  532. }
  533. /// <summary>
  534. /// 加载事务组件
  535. /// </summary>
  536. /// <param name="packageId"></param>
  537. /// <param name="compId"></param>
  538. /// <returns></returns>
  539. public static EngineComponent GetEngineComponent(string packageId, string compId)
  540. {
  541. var componentXml = GetComponentFromFile(packageId, compId);
  542. if (componentXml == null)
  543. return null;
  544. var component = new EngineComponent().ModelFrom(componentXml);
  545. return component;
  546. }
  547. /// <summary>
  548. /// 从文件加载事务组件
  549. /// </summary>
  550. /// <param name="packageId"></param>
  551. /// <param name="compId"></param>
  552. /// <returns></returns>
  553. public static IwbXmlNode GetComponentFromFile(string packageId, string compId)
  554. {
  555. string fileName = $"{PackageBasePath}{packageId}/component.iwbx";
  556. if (!File.Exists(fileName))
  557. return null;
  558. var xDoc = XDocument.Load(fileName);
  559. var root = xDoc.Root;
  560. var component = root != null && root.HasElements
  561. ? (from e in root.Elements("ComponentInfo") where e.Attribute("id")?.Value == compId select e).FirstOrDefault()
  562. : null;
  563. if (component == null)
  564. return null;
  565. var iwbNode = IwbXmlNode.ParseGenericXml(component.ToString());
  566. return iwbNode;
  567. }
  568. /// <summary>
  569. /// 从xml加载事务组件
  570. /// </summary>
  571. /// <param name="xml"></param>
  572. /// <param name="compId"></param>
  573. /// <returns></returns>
  574. public static IwbXmlNode GetComponentFromXml(string xml, string compId)
  575. {
  576. if (xml.IsEmpty())
  577. {
  578. return null;
  579. }
  580. var xDoc = XDocument.Parse(xml);
  581. var root = xDoc.Root;
  582. var component = root != null && root.HasElements
  583. ? (from e in root.Elements("ComponentInfo") where e.Attribute("id")?.Value == compId select e).FirstOrDefault()
  584. : null;
  585. if (component == null)
  586. return null;
  587. var iwbNode = IwbXmlNode.ParseGenericXml(component.ToString());
  588. return iwbNode;
  589. }
  590. #endregion
  591. }
  592. }