SSZFM01001.xjs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <Script type="xscript4.0"><![CDATA[/***************************************************************************************
  3. * System Name :
  4. * Job Name : DataSet => XML 자동 변환
  5. * File Name : SSZFM01001.xjs
  6. * Creator :
  7. * Make Date :
  8. *
  9. * Description : DATASET을 XML로 자동 변환한다.
  10. *---------------------------------------------------------------------------------------
  11. * Modify Date Modifier Modify Description
  12. *---------------------------------------------------------------------------------------
  13. *
  14. *---------------------------------------------------------------------------------------
  15. ****************************************************************************************/
  16. //=======================================================================================
  17. // Function
  18. //-------------------------------------------------------------------------------------------------------------------------------------------------------------
  19. /***********************************************************************************************
  20. * 함수명 : lf_convertDsToXml(pDsArr, pXmlStr)
  21. * 설 명 : DataSet을 XML로 변환한다.
  22. 예) var sParamObjArr = [{ds: "ds_data_b", path:"f/b", filter: "test == 1"}
  23. ,{ds: "ds_data_a", path:"", filter: ""}];
  24. var sReturn = lf_convertDsToXml(sParamObjArr, gXmlFormat);
  25. path는 'f/b'와 같이 상대경로나 '/a/f/b' 와 같이 절대 경로로 사용 가능. 공백이면 dataset id로 노드 검색
  26. dataset 명칭은 '_' 이후에 node 명칭과 일치 해야 함.
  27. * argument : pDsArr : [{ds : Dataset id, path : xml 경로(상대경로, 절대경로)}]
  28. pXmlStr : XML(string type)
  29. pParam : option 용 parameter Object
  30. pParam.nullNodeYN = 'Y' / 'N' : 공백 node를 생성할지 여부
  31. pParam.cDataYN = 'N' / 그외 : cData 사용여부(cData 완전제외를 위한 파라미터)
  32. * return Type : XML string : 성공시
  33. 'error' : 실패시
  34. * 작성자 :
  35. ************************************************************************************************/
  36. function lf_convertDsToXml(pDsArr, pXmlStr, pParam)
  37. {
  38. if(utlf_isNull(pDsArr)) return "error";
  39. try{
  40. var domParser = new DomParser;
  41. var domDoc = domParser.parseFromString(pXmlStr);
  42. var sTmpDocelement = domDoc.documentElement;
  43. if(domDoc == null){
  44. sysf_messageBox("XML 형식이 잘못 되었습니다.", "E");
  45. return "error";
  46. }
  47. var sTmpCreateNode;
  48. var sTmpCreateValue;
  49. var sTmpParentNode;
  50. var sDsNode = "";
  51. var sDsPath = "";
  52. var sNodeList;
  53. var sParentList;
  54. var sDsObj;
  55. var sFilter;
  56. var sDsColumnId = "";
  57. var sDsColumnValue = "";
  58. var sNullUseYN;
  59. var sTmpChkXmlType;
  60. if(!utlf_isNull(pParam)){ //Option용 parameter 세팅
  61. sNullUseYN = utlf_isNull(pParam.nullNodeYN) ? 'Y' : pParam.nullNodeYN;
  62. }else{
  63. sNullUseYN = 'Y';
  64. }
  65. for(var i = pDsArr.length-1; i >= 0; i--){
  66. sDsNode = pDsArr[i].ds.slice(pDsArr[i].ds.lastIndexOf("_")+1);
  67. sDsPath = pDsArr[i].path;
  68. sDsObj = this.objects[pDsArr[i].ds];
  69. if(utlf_isNull(sDsObj)){
  70. sysf_messageBox(pDsArr[i].ds + " 데이터셋은 존재하지 않습니다.", "E");
  71. return "error";
  72. }
  73. if(!utlf_isNull(pDsArr[i].filter)) sDsObj.filter(pDsArr[i].filter); //filter 값이 세팅된 경우 dataset 필터링
  74. for(var iRow = sDsObj.rowcount - 1; iRow >= 0 ; iRow--){
  75. if(iRow < sDsObj.rowcount -1){
  76. sTmpParentNode = domDoc.createElement(sDsNode);
  77. sParentList = domDoc.getElementsByPath(utlf_isNull(sDsPath) ? sDsNode : sDsPath);
  78. if(utlf_isNull(sParentList)){
  79. sysf_messageBox(sDsPath + " path가 올바르지 않습니다.", "E");
  80. return "error";
  81. }
  82. sTmpDocelement.insertBefore(sTmpParentNode, sParentList[0]);
  83. }
  84. for(var j = 0; j <= sDsObj.colcount-1; j++){ //dataset에서 컬럼 값 추출
  85. var sCurrentPath = "";
  86. sDsColumnId = utlf_transNullToEmpty(sDsObj.getColID(j));
  87. sDsColumnValue = utlf_transNullToEmpty(sDsObj.getColumn(iRow, j));
  88. if(!utlf_isNull(sDsPath)){ //path 값이 있는 경우
  89. sCurrentPath = sDsPath;
  90. }else{
  91. sCurrentPath = sDsNode;
  92. }
  93. if(iRow == sDsObj.rowcount - 1){ //depth가 1인 경우
  94. if(sNullUseYN == 'N' && utlf_isNull(sDsColumnValue)){
  95. var sTmpParentNodes = domDoc.getElementsByPath(sCurrentPath);
  96. var sDeleteNodeList = domDoc.getElementsByPath(sCurrentPath + "/" + sDsColumnId);
  97. sTmpParentNodes.get_item(0).removeChild(sDeleteNodeList[0]);
  98. continue;
  99. }
  100. sCurrentPath = sCurrentPath + "/" + sDsColumnId;
  101. sNodeList = domDoc.getElementsByPath(sCurrentPath);
  102. if(utlf_isNull(sNodeList)){
  103. sysf_messageBox(sCurrentPath + " path가 올바르지 않습니다.", "E");
  104. return "error";
  105. }
  106. sTmpChkXmlType = domParser.parseFromString(sDsColumnValue);
  107. //pParam.cDataYN = 'N' / 그외 : cData 사용여부(cData 완전제외를 위한 파라미터)
  108. //2.0에서 lf_convertDsToXml 이 함수사용후 저장하면
  109. //1.0에서 조회를할때 cData가 2중으로 감싸져서 에러가발생
  110. //위 문제로인해 cData를 완전제외하기위한 파라미터를 추가
  111. if(lf_checkSpecialChar(sDsColumnValue) && sTmpChkXmlType == null && !utlf_isNull(sDsColumnValue) && (utlf_isNull(pParam) || utlf_isNull(pParam.cDataYN) || pParam.cDataYN != "N")){ //특수문자가 있으면 컬럼 데이터가 XML TYPE 아닌 경우
  112. sTmpCreateValue = domDoc.createCDATASection(sDsColumnValue); //cdata 처리
  113. }else{
  114. sDsColumnValue = String(sDsColumnValue).replace("&", "&amp;");
  115. sDsColumnValue = String(sDsColumnValue).replace("<", "&lt;");
  116. sDsColumnValue = String(sDsColumnValue).replace(">", "&gt;");
  117. sTmpCreateValue = domDoc.createTextNode(sDsColumnValue);
  118. }
  119. sNodeList[0].appendChild(sTmpCreateValue);
  120. }else if(iRow < sDsObj.rowcount - 1){ //depth가 2이상인 경우
  121. if(sNullUseYN == 'N' && utlf_isNull(sDsColumnValue)) continue; //빈 값을 노드로 만들지 않을 경우(option이 'N'일 경우)
  122. sCurrentPath = sCurrentPath + "[1]";
  123. sNodeList = domDoc.getElementsByPath(sCurrentPath);
  124. if(utlf_isNull(sNodeList)){
  125. sysf_messageBox(sCurrentPath + " path가 올바르지 않습니다.", "E");
  126. return "error";
  127. }
  128. sTmpChkXmlType = domParser.parseFromString(sDsColumnValue);
  129. //2.0에서 lf_convertDsToXml 이 함수사용후 저장하면
  130. //1.0에서 조회를할때 cData가 2중으로 감싸져서 에러가발생
  131. //위 문제로인해 cData를 완전제외하기위한 파라미터를 추가
  132. if(lf_checkSpecialChar(sDsColumnValue) && sTmpChkXmlType == null && sDsColumnValue != "" && (utlf_isNull(pParam) || utlf_isNull(pParam.cDataYN) || pParam.cDataYN != "N")){ //특수문자가 있는경우
  133. sTmpCreateValue = domDoc.createCDATASection(sDsColumnValue); //cdata 처리
  134. }else{
  135. sDsColumnValue = String(sDsColumnValue).replace("&", "&amp;");
  136. sDsColumnValue = String(sDsColumnValue).replace("<", "&lt;");
  137. sDsColumnValue = String(sDsColumnValue).replace(">", "&gt;");
  138. sTmpCreateValue = domDoc.createTextNode(sDsColumnValue);
  139. }
  140. sTmpCreateNode = domDoc.createElement(sDsColumnId);
  141. sTmpCreateNode.appendChild(sTmpCreateValue);
  142. sNodeList[0].appendChild(sTmpCreateNode);
  143. }
  144. }
  145. }
  146. }
  147. }catch(e){
  148. return "error";
  149. }
  150. return domDoc.source.slice(domDoc.source.lastIndexOf("?>")+3);
  151. }
  152. //특수문자 체크함수
  153. function lf_checkSpecialChar(pString)
  154. {
  155. var sRtn = true;
  156. var sBit;
  157. var sStandard = "~!@#$%^&*-+./=_`{|}()\\?<>";
  158. for(var i=0, cmp=pString.length; i < cmp; i++){
  159. sBit = pString.charAt(i);
  160. if(sStandard.indexOf(sBit) == -1 ){
  161. sRtn = false;
  162. }else{
  163. sRtn = true;
  164. break;
  165. }
  166. }
  167. return sRtn;
  168. }]]></Script>