일단 테스트 해본다고 몇게 코드 결합해서 만들어 봤는데... 브라우저 마다 동작에 차이가 있네요.
테스트 결과 현재 FF 에서만 정상적으로 동작이 되고 타 브라우저에는 보안이슈가 발생합니다.
그런데 잼있는게.. 몇몇 책에서 로컬 파일 시스템에 있는 파일을 읽는데 사용할수 있다.(ex: JavaScript: The Definitive Guide, Fifth Edition)
라고 기술 하고 있는데..이게 오타인건지.. 아니면 브라우저 버전업 이후 정책 변경이 일어난건지는 잘 모르겠습니다.
동일 기능을 크로스브라우징 하게 구현 하기 위해서는 로컬 파일 첨부하는 순간 서버 한번 다녀 오셔야 할거 같습니다. -_-;;
<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>