javascript에서 로컬 xml파일 로드 어떻게 하세요?

2,386 views
Skip to first unread message

GIL

unread,
Sep 24, 2011, 11:21:59 AM9/24/11
to Korea Spring User Group
javascript에서 로컬 xml 파일 load 방법

안녕하세요
javascript에서 xml을 로드 시키기 위해
----------------------------------------------
var xmlDoc = new ActiveXobject("Microsoft.XMLDOC)
xmlDoc.load("http://10.254.187.87/xml/xmlfile1.xml")
----------------------------------------------
이런식으로 로드를 시키고 있는데 로컬에 있는 xml 파일을 로드 시킬때는
자바스크립트 오류가 납니다. '액세스가 거부 되었습니다.'라는 오류로 xml 로드를 하지
못하더라구요 해결 방법이 있나요?

고종봉

unread,
Sep 25, 2011, 10:39:04 PM9/25/11
to ks...@googlegroups.com
자바 스크립트에서 로컬 파일시스템 및 다른 도메인에 접근하는 것은,

보안상 안되지 않나요??ㅎ

cross site script(XSS) 관련 보안이슈들 찾아보세요.


2011년 9월 25일 오전 12:21, GIL <jb9...@gmail.com>님의 말:

--
Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.


Yong-Un Heo

unread,
Sep 26, 2011, 3:13:16 AM9/26/11
to ks...@googlegroups.com
일단 테스트 해본다고 몇게 코드 결합해서 만들어 봤는데... 브라우저 마다 동작에 차이가 있네요.

테스트 결과 현재 FF 에서만 정상적으로 동작이 되고 타 브라우저에는 보안이슈가 발생합니다.

그런데 잼있는게.. 몇몇 책에서 로컬 파일 시스템에 있는 파일을 읽는데 사용할수 있다.(ex: JavaScript: The Definitive Guide, Fifth Edition)

라고 기술 하고 있는데..이게 오타인건지.. 아니면 브라우저 버전업 이후 정책 변경이 일어난건지는 잘 모르겠습니다.

동일 기능을 크로스브라우징 하게 구현 하기 위해서는 로컬 파일 첨부하는 순간 서버 한번 다녀 오셔야 할거 같습니다. -_-;; 


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
XML = {};
XML.newDocument = function(rootTagName, namespaceURL) {
  if (!rootTagName) rootTagName = "";
  if (!namespaceURL) namespaceURL = "";
  
  if (document.implementation && document.implementation.createDocument) {
      return document.implementation.createDocument(namespaceURL,
                                                    rootTagName, null);
  }else {
 function CreateMSXMLDocumentObject () {
     if (typeof (ActiveXObject) != "undefined") {
         var progIDs = [
                         "Msxml2.DOMDocument.6.0", 
                         "Msxml2.DOMDocument.5.0", 
                         "Msxml2.DOMDocument.4.0", 
                         "Msxml2.DOMDocument.3.0", 
                         "MSXML2.DOMDocument", 
                         "MSXML.DOMDocument"
                       ];

              if(!!XML._MSXMLDO) return XML._MSXMLDO; 
         for (var i = 0; i < progIDs.length; i++) {
             try { 
               var factory = new ActiveXObject(progIDs[i]); 
               if(!!factory) {
               XML._MSXMLDO = factory;
               return XML._MSXMLDO; 
             }                  
             } catch(e) {
               continue;
           };
         }
     }
     return null;
 }

      var doc = CreateMSXMLDocumentObject();//new ActiveXObject("MSXML2.DOMDocument");

      if (rootTagName) {
          var prefix = "";
          var tagname = rootTagName;
          var p = rootTagName.indexOf(':');
          if (p != -1) {
              prefix = rootTagName.substring(0, p);
              tagname = rootTagName.substring(p+1);
          }

          if (namespaceURL) {
              if (!prefix) prefix = "a0";
          }
          else prefix = "";

          var text = "<" + (prefix?(prefix+":"):"") +  tagname +
              (namespaceURL
               ?(" xmlns:" + prefix + '="' + namespaceURL +'"')
               :"") +
              "/>";
          doc.loadXML(text);
      }
      return doc;
  }
};

XML.loadAsync = function(url, callback) {
  var xmldoc = XML.newDocument();
  if (document.implementation && document.implementation.createDocument) {
      xmldoc.onload = function() { callback(xmldoc); };
  }
  else {
      xmldoc.onreadystatechange = function() {
          if (xmldoc.readyState == 4) callback(xmldoc);
      };
  }
  xmldoc.load(url);
};

var setXml = function(poXML){

  var resTable = document.getElementById ("resTable");
  var xmlNodes = ["title", "description", "pubDate", "link"];

  var itemTags = poXML.getElementsByTagName ("item");
  for (i = 0; i < itemTags.length; i++) {
      resTable.insertRow (i);
      for (j = 0; j < xmlNodes.length; j++) {
          var recordNode = itemTags[i].getElementsByTagName (xmlNodes[j])[0];
          resTable.rows[i].insertCell (j);
          if ('textContent' in recordNode)
              resTable.rows[i].cells[j].innerHTML = recordNode.textContent;
          else
              resTable.rows[i].cells[j].innerHTML = recordNode.text;
      }
  }  
};

window.onload = function(){  
  document.getElementById('ipbLoad').onclick = function(){
    var voEle = document.getElementById('ipbFile');
    XML.loadAsync(voEle.value, setXml);
  }
}
</script>
</head>
<body>
<input type="file" id='ipbFile'/>
<input type="button" value='loadXMl' id='ipbLoad'/>

<table border="1px">
    <thead style="font-weight: bold;">
        <tr>
            <td>Title</td>
            <td>Description</td>
            <td>PubDate</td>
            <td>Link</td>
        </tr>
    </thead>
    <tbody id="resTable">
    </tbody>
</table>
</body>
</html>

예제 XML
<?xml version="1.0" encoding="utf-8"?>
<news>
    <channel>
        <item>
            <title>Paula Abdul leaves American Idol</title>
            <description>Paula Abdul has officially confirmed that she won’t be returning to American Idol this season. "With sadness in my heart, I’ve decided not to return to Idol," she wrote on her Twitter page.</description>
            <pubDate>Wed, August 5, 2009 19:52:31 +0200</pubDate>
        </item>

        <item>
            <title>Criminal Minds star Moore hit by car</title>
            <description>Shemar Moore, 39, who plays FBI Agent Derek Morgan in the CBS drama Criminal Minds, was hit by a car while bicycling in Los Angeles last Saturday.</description>
            <pubDate>Thu, August 4, 2009 13:28:12 +0200</pubDate>
        </item>

        <item>
            <title>Madonna writes love song for ex-husband</title>
            <description>Madonna has sparked speculation that she wants to get back with her ex-husband, Guy Ritchie, after writing a love song for him in which she calls him her "eternal love".</description>
            <pubDate>Fri, July 31, 2009 04:01:50 +0200</pubDate>
        </item>
    </channel>
</news>


2011년 9월 26일 오전 11:39, 고종봉 <mercu...@gmail.com>님의 말:

Hyunsok Oh

unread,
Sep 26, 2011, 8:49:34 PM9/26/11
to ks...@googlegroups.com
원래 액티브액스에서 로컬리소스 억세스가 제한이 없던게 윈도즈에 uac도입되면서 비스타부터 불가능해졌죠. 기억하시는 분들도 많겠지만 그때 액티브엑스 개발하는 사람들은 다 한번씩 억세스 컨트롤관련해서 뒤집어 엎었었습니다. 

한국도 맥 사용자 비율이 꽤 높아진 것으로 아는데 msxml같은 콤포넌트를 쓰는거 보다 자바스크맆트로 된 라이브러리를 써보시는건 어떨지... 물론 로컬파일 억세스는 물건너가는거긴 합니다만...

Sent from my iPhone

GIL

unread,
Oct 3, 2011, 2:20:00 AM10/3/11
to Korea Spring User Group
해결방법: 아래 답변글을 충분히 이해하고 해결을 한건 아닙니다.(일정을 마추기위해 우선 제 능력이 되는 방법 무식한 방법으로 해
결)
제가 해결한 방법은 javascript는 client단 언어이기 때문에 로컬 영역 파일에 접근하는데 제한이 된답니다.
그래서 서버 디렉토리로 파일을 옮겨 접근을 해야 해결이 됩니다.

getRealPath()로 서버 디렉토리를 찾습니다. 그곳에 폴더를 만들어 xml을 저장하고 불러오기를 했습니다.

String realPath = request.getRealPath("/")

File xml = new File(realPath/XMLFileServer/xxx.xml)
---javascript---
ex> xmlDoc.load(http://localhost:8080/ProjectName/XMLFileServer/
xxx.xml)

Andrew,Ahn

unread,
Oct 3, 2011, 8:51:42 PM10/3/11
to ks...@googlegroups.com
굳이 로컬에 접근하실려면, ActiveX로 만드시거나,
브라우져 옵션에 보안-로컬파일 실행쪽 권한 주셔야 합니다.

2011/10/3 GIL <jb9...@gmail.com>:

> --
> Google 그룹스 'Korea Spring User Group' 그룹에 가입했으므로 본 메일이 전송되었습니다.
> 이 그룹에 게시하려면 ks...@googlegroups.com(으)로 이메일을 보내세요.
> 그룹에서 탈퇴하려면 ksug+uns...@googlegroups.com로 이메일을 보내주세요.
> 더 많은 옵션을 보려면 http://groups.google.com/group/ksug?hl=ko에서 그룹을 방문하세요.
>
>

--
/**
* All Life is Problem Solving - Karl Popper
*
* @email Andrew, Ahn <rats...@gmail.com>
* @blog http://xinublog.tistory.com
* @deprecated twitter @ratsbomb
* @googletalk rats...@gmail.com
*/

Reply all
Reply to author
Forward
0 new messages