123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- <?xml version="1.0" encoding="utf-8"?>
- <Script type="xscript4.0"><![CDATA[/***************************************************************************************
- * System Name :
- * Job Name : DataSet => XML 자동 변환
- * File Name : SSZFM01001.xjs
- * Creator :
- * Make Date :
- *
- * Description : DATASET을 XML로 자동 변환한다.
- *---------------------------------------------------------------------------------------
- * Modify Date Modifier Modify Description
- *---------------------------------------------------------------------------------------
- *
- *---------------------------------------------------------------------------------------
- ****************************************************************************************/
- //=======================================================================================
- // Function
- //-------------------------------------------------------------------------------------------------------------------------------------------------------------
- /***********************************************************************************************
- * 함수명 : lf_convertDsToXml(pDsArr, pXmlStr)
- * 설 명 : DataSet을 XML로 변환한다.
- 예) var sParamObjArr = [{ds: "ds_data_b", path:"f/b", filter: "test == 1"}
- ,{ds: "ds_data_a", path:"", filter: ""}];
- var sReturn = lf_convertDsToXml(sParamObjArr, gXmlFormat);
- path는 'f/b'와 같이 상대경로나 '/a/f/b' 와 같이 절대 경로로 사용 가능. 공백이면 dataset id로 노드 검색
- dataset 명칭은 '_' 이후에 node 명칭과 일치 해야 함.
-
- * argument : pDsArr : [{ds : Dataset id, path : xml 경로(상대경로, 절대경로)}]
- pXmlStr : XML(string type)
- pParam : option 용 parameter Object
- pParam.nullNodeYN = 'Y' / 'N' : 공백 node를 생성할지 여부
- pParam.cDataYN = 'N' / 그외 : cData 사용여부(cData 완전제외를 위한 파라미터)
- * return Type : XML string : 성공시
- 'error' : 실패시
- * 작성자 :
- ************************************************************************************************/
- function lf_convertDsToXml(pDsArr, pXmlStr, pParam)
- {
- if(utlf_isNull(pDsArr)) return "error";
-
- try{
- var domParser = new DomParser;
- var domDoc = domParser.parseFromString(pXmlStr);
- var sTmpDocelement = domDoc.documentElement;
-
- if(domDoc == null){
- sysf_messageBox("XML 형식이 잘못 되었습니다.", "E");
- return "error";
- }
- var sTmpCreateNode;
- var sTmpCreateValue;
- var sTmpParentNode;
- var sDsNode = "";
- var sDsPath = "";
- var sNodeList;
- var sParentList;
- var sDsObj;
- var sFilter;
- var sDsColumnId = "";
- var sDsColumnValue = "";
- var sNullUseYN;
- var sTmpChkXmlType;
-
- if(!utlf_isNull(pParam)){ //Option용 parameter 세팅
- sNullUseYN = utlf_isNull(pParam.nullNodeYN) ? 'Y' : pParam.nullNodeYN;
- }else{
- sNullUseYN = 'Y';
- }
-
- for(var i = pDsArr.length-1; i >= 0; i--){
- sDsNode = pDsArr[i].ds.slice(pDsArr[i].ds.lastIndexOf("_")+1);
- sDsPath = pDsArr[i].path;
- sDsObj = this.objects[pDsArr[i].ds];
-
- if(utlf_isNull(sDsObj)){
- sysf_messageBox(pDsArr[i].ds + " 데이터셋은 존재하지 않습니다.", "E");
- return "error";
- }
-
- if(!utlf_isNull(pDsArr[i].filter)) sDsObj.filter(pDsArr[i].filter); //filter 값이 세팅된 경우 dataset 필터링
-
- for(var iRow = sDsObj.rowcount - 1; iRow >= 0 ; iRow--){
- if(iRow < sDsObj.rowcount -1){
- sTmpParentNode = domDoc.createElement(sDsNode);
- sParentList = domDoc.getElementsByPath(utlf_isNull(sDsPath) ? sDsNode : sDsPath);
-
- if(utlf_isNull(sParentList)){
- sysf_messageBox(sDsPath + " path가 올바르지 않습니다.", "E");
- return "error";
- }
-
- sTmpDocelement.insertBefore(sTmpParentNode, sParentList[0]);
- }
-
- for(var j = 0; j <= sDsObj.colcount-1; j++){ //dataset에서 컬럼 값 추출
- var sCurrentPath = "";
- sDsColumnId = utlf_transNullToEmpty(sDsObj.getColID(j));
- sDsColumnValue = utlf_transNullToEmpty(sDsObj.getColumn(iRow, j));
-
- if(!utlf_isNull(sDsPath)){ //path 값이 있는 경우
- sCurrentPath = sDsPath;
- }else{
- sCurrentPath = sDsNode;
- }
-
- if(iRow == sDsObj.rowcount - 1){ //depth가 1인 경우
- if(sNullUseYN == 'N' && utlf_isNull(sDsColumnValue)){
- var sTmpParentNodes = domDoc.getElementsByPath(sCurrentPath);
- var sDeleteNodeList = domDoc.getElementsByPath(sCurrentPath + "/" + sDsColumnId);
- sTmpParentNodes.get_item(0).removeChild(sDeleteNodeList[0]);
- continue;
- }
-
- sCurrentPath = sCurrentPath + "/" + sDsColumnId;
- sNodeList = domDoc.getElementsByPath(sCurrentPath);
-
- if(utlf_isNull(sNodeList)){
- sysf_messageBox(sCurrentPath + " path가 올바르지 않습니다.", "E");
- return "error";
- }
-
- sTmpChkXmlType = domParser.parseFromString(sDsColumnValue);
-
- //pParam.cDataYN = 'N' / 그외 : cData 사용여부(cData 완전제외를 위한 파라미터)
- //2.0에서 lf_convertDsToXml 이 함수사용후 저장하면
- //1.0에서 조회를할때 cData가 2중으로 감싸져서 에러가발생
- //위 문제로인해 cData를 완전제외하기위한 파라미터를 추가
- if(lf_checkSpecialChar(sDsColumnValue) && sTmpChkXmlType == null && !utlf_isNull(sDsColumnValue) && (utlf_isNull(pParam) || utlf_isNull(pParam.cDataYN) || pParam.cDataYN != "N")){ //특수문자가 있으면 컬럼 데이터가 XML TYPE 아닌 경우
- sTmpCreateValue = domDoc.createCDATASection(sDsColumnValue); //cdata 처리
- }else{
- sDsColumnValue = String(sDsColumnValue).replace("&", "&");
- sDsColumnValue = String(sDsColumnValue).replace("<", "<");
- sDsColumnValue = String(sDsColumnValue).replace(">", ">");
-
- sTmpCreateValue = domDoc.createTextNode(sDsColumnValue);
- }
-
- sNodeList[0].appendChild(sTmpCreateValue);
- }else if(iRow < sDsObj.rowcount - 1){ //depth가 2이상인 경우
-
- if(sNullUseYN == 'N' && utlf_isNull(sDsColumnValue)) continue; //빈 값을 노드로 만들지 않을 경우(option이 'N'일 경우)
-
- sCurrentPath = sCurrentPath + "[1]";
- sNodeList = domDoc.getElementsByPath(sCurrentPath);
-
- if(utlf_isNull(sNodeList)){
- sysf_messageBox(sCurrentPath + " path가 올바르지 않습니다.", "E");
- return "error";
- }
-
- sTmpChkXmlType = domParser.parseFromString(sDsColumnValue);
-
- //2.0에서 lf_convertDsToXml 이 함수사용후 저장하면
- //1.0에서 조회를할때 cData가 2중으로 감싸져서 에러가발생
- //위 문제로인해 cData를 완전제외하기위한 파라미터를 추가
- if(lf_checkSpecialChar(sDsColumnValue) && sTmpChkXmlType == null && sDsColumnValue != "" && (utlf_isNull(pParam) || utlf_isNull(pParam.cDataYN) || pParam.cDataYN != "N")){ //특수문자가 있는경우
- sTmpCreateValue = domDoc.createCDATASection(sDsColumnValue); //cdata 처리
- }else{
- sDsColumnValue = String(sDsColumnValue).replace("&", "&");
- sDsColumnValue = String(sDsColumnValue).replace("<", "<");
- sDsColumnValue = String(sDsColumnValue).replace(">", ">");
-
- sTmpCreateValue = domDoc.createTextNode(sDsColumnValue);
- }
-
- sTmpCreateNode = domDoc.createElement(sDsColumnId);
-
- sTmpCreateNode.appendChild(sTmpCreateValue);
- sNodeList[0].appendChild(sTmpCreateNode);
- }
- }
- }
- }
- }catch(e){
- return "error";
- }
-
- return domDoc.source.slice(domDoc.source.lastIndexOf("?>")+3);
- }
- //특수문자 체크함수
- function lf_checkSpecialChar(pString)
- {
- var sRtn = true;
- var sBit;
- var sStandard = "~!@#$%^&*-+./=_`{|}()\\?<>";
- for(var i=0, cmp=pString.length; i < cmp; i++){
- sBit = pString.charAt(i);
- if(sStandard.indexOf(sBit) == -1 ){
- sRtn = false;
- }else{
- sRtn = true;
- break;
- }
- }
- return sRtn;
- }]]></Script>
|