最近工作中需要将一些xml文档在浏览器中的iframe中形成预览,最先想到的
就是用<iframe src="aa.xml"></ifame>,但是这种做法在IE9、IE10中,却无法正常显示,
在IE9、IE10的ifame中是直接把xml当作html处理的,结果显示的都是一些字符,于是自己
就写了一个类似的效果,主要就是一个递归,代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>XML_Tree</title>
</head>
<body>
<div id="xml_tree"></div>
</body>
</html>
<script type="text/javascript">
(function(){
var _xml = {
xmlDoc: {
LOADTYPES: {
XML_PATH: 0, XML_STRING: 1
},
loadDoc: function(str, loadType){
var doc = null;
if (window.ActiveXObject){
doc = new ActiveXObject("Microsoft.XMLDOM");
doc.async = false;
try{
if (loadType == this.LOADTYPES.XML_PATH){
doc.load(str);
}
else if (loadType == this.LOADTYPES.XML_STRING){
doc.loadXML(str);
}
}
catch(e){}
}
else if (window.XMLHttpRequest){
var xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET", str, false);
xmlhttp.send(null);
doc = xmlhttp.responseXML;
}
return doc;
}
},
xmlTree: {
createTree: function(str, loadType){
var arr_HTML = [],
doc = _xml.xmlDoc.loadDoc(str, loadType),
doc_Nodes = doc.childNodes;
if (doc_Nodes.length > 1){
var nodeFirst = doc_Nodes[0];
if (nodeFirst.nodeType == 7){
arr_HTML.push('<div> <span style="color:#0000FF;"><?</span><span style="color:#0000FF;">xml ', nodeFirst.text, ' </span><span style="color:#0000FF;">?></span></div>');
}
}
return '<span style="font-size: 12px;line-height:17px;font-family:Verdana;">' + arr_HTML.join('') + '<span>' + this.createNodeHTML(doc.documentElement) + '</span></span>';
},
createNodeHTML: function(xmlNode){
if (!xmlNode){ return ''; }
var arr_HTML = [],
alink = '<a style="font-size:14px;font-family:Courier New;color:#990000;text-decoration:none;" href="javascript:void(0);">-</a> ',
onclick = "var nodes = this.parentNode.childNodes,show=this.getAttribute('data-show')=='1'; for(var i=0,L=nodes.length;i<L;i++){ if (i!=0){ if (show){ this.setAttribute('data-show','0');nodes[i].style.display = 'none';this.childNodes[0].innerHTML='+'; }else{ this.setAttribute('data-show','1');nodes[i].style.display = '';this.childNodes[0].innerHTML='-'; } }}";
if (xmlNode.nodeType == 1){
var AttrL = xmlNode.attributes.length,
ChildL = xmlNode.childNodes.length,
cursor = ChildL == 0 ? '' : 'cursor:pointer;',
fh = ChildL == 0 ? ' ' : alink;
arr_HTML.push('<div οnclick="', onclick, '" data-show="1" style="padding-left:25px;text-indent:-25px;', cursor,'">', fh, '<span><span style="color:#0000FF;"><</span><span style="color:#990000;">', xmlNode.tagName, '</span>');
for(var i=0;i<AttrL;i++){
var attr = xmlNode.attributes[i];
arr_HTML.push(' <span style="color:#990000;">', attr.nodeName,'</span><span style="color:#0000FF;">="</span><span style="font-weight:bold;">', attr.nodeValue, '</span><span style="color:#0000FF;">"</span>');
}
if (ChildL == 0){
arr_HTML.push('<span style="color:#0000FF;">/></span></span></div>');
}
else{
arr_HTML.push('<span style="color:#0000FF;">></span></span></div>');
arr_HTML.push('<div>');
for(var i=0;i<ChildL;i++){
arr_HTML.push('<div style="padding-left:30px;">', arguments.callee(xmlNode.childNodes[i]), '</div>')
}
arr_HTML.push('</div>');
arr_HTML.push('<div> <span style="color:#0000FF;"></</span><span style="color:#990000;">', xmlNode.tagName, '</span><span style="color:#0000FF;">></span></div>');
}
}
else if (xmlNode.nodeType == 3){
if (!/^\s+$/.test(xmlNode.nodeValue)){
arr_HTML.push('<div> <span style="font-weight:bold;">', xmlNode.nodeValue, '</span></div>');
}
}
else if (xmlNode.nodeType == 8){
onclick = "var show=this.getAttribute('data-show')=='1';if (show){ this.setAttribute('data-show', 0);this.nextSibling.style.display='none';this.firstChild.innerHTML='+'; }else{ this.setAttribute('data-show', 1);this.nextSibling.style.display='';this.firstChild.innerHTML='-'; }";
arr_HTML.push('<div style="padding-left:25px;text-indent:-25px;', cursor,'"><span style="cursor:pointer;" data-show="1" οnclick="', onclick, '">', alink, '<span style="color:#0000FF;"><!--</span></span>');
arr_HTML.push('<span><pre style="padding-left:30px;color:#888888;">', xmlNode.nodeValue.replace(/</igm, '<').replace(/>/igm, '>'), '</pre></span>');
arr_HTML.push(' <span style="color:#0000FF;">--></span></div>');
}
return arr_HTML.join('');
}
}
}
window.xml = _xml;
})();
var url_arr = [
'XML/XMLFile.xml',
'XML/XMLFile2.xml',
'XML/XMLFile3.xml'
],
str = xml.xmlTree.createTree(url_arr[0], 0);
document.getElementById('xml_tree').innerHTML = str;
</script>