Отобразить XML
Нужно на одной странице отобразить несколько xml в виде структуры как она есть, т.е. с тегами, открывающимися по клику.
Наподобие того как браузер отображает xml-файл. Пробовал открывать xml-файлы в iframe, но нормально отображает только firefox. Нужен какой-то способ указать браузеру что во фрейме именно xml, или же отыскать библиотеку, представляющие данные нужным образом, т.е. с подсветкой тегов и фолдингом |
Пишут что все должно работать по встроенным стилям.
Цитата:
|
Ну так оно и работает, если просто открыть xml-файл.
А мне нужно много их на одной странице, поэтому либо iframe, либо XMLHttpRequest. и в iframe оказалось всё не так радужно. Написал собственный "хайлайтер", буду рад критике выглядит так xmlviewer.js
// возвращает хтмл обработанной ноды
function extractNode(elem) {
var result = '';
for (var i=0; i< elem.childNodes.length; i++) {
if (elem.childNodes[i].nodeType == 1) { // xml нода
result += '<div class="tgname opener minus"><'+elem.childNodes[i].nodeName+'></div>';
result += '<span class="tgcontent">';
result += extractNode(elem.childNodes[i]);
result += '</span>';
result += '<div class="tgname ender"></'+elem.childNodes[i].tagName+'></div>';
}
// текстовая нода
if (elem.childNodes[i].nodeType == 3) result += '<p class="tgtxt">'+elem.childNodes[i].data+'</p>';
}
return result;
}
// формирует из xml ноду содержащую отображение ноды с подсветкой и фолдингом
function formExtend(xmlcontent) {
var xmlNode = document.createElement('div');
xmlNode.className = 'xmlnode';
xmlNode.innerHTML = xmlcontent;
xmlNode.innerHTML = extractNode(xmlNode);
var spans = xmlNode.getElementsByTagName('SPAN');
for (var i=0;i<spans.length;i++) {
spans[i].previousSibling.onclick = function(event) {
event = event || window.event;
if (event.stopPropagation) {
event.stopPropagation()
} else {
event.cancelBubble = true
}
this.classList.toggle('plus');
this.classList.toggle('minus');
this.nextSibling.style.display = this.nextSibling.style.display ? '' : 'none';
this.nextSibling.nextSibling.style.display = this.nextSibling.nextSibling.style.display ? '' : 'none';
};
}
return xmlNode;
}
xmlviewer.css
.tgname {color:grey; font-size:0.8em}
p {margin:0}
span.tgcontent {display:block; margin-left:0.1em;padding-left:1.3em;border-left:1px dotted #ccc}
div.opener {cursor:pointer}
div.ender{margin-left:1em}
div.opener:hover {color:#dd0000;}
div.opener:hover + span + div {color:#dd0000;}
div.opener:hover + span {background:#f9f9f9}
.plus:before {content:"+ ";font-family:Consolas;font-weight:bold}
.minus:before {content:"- ";font-family:Consolas;font-weight:bold}
index.html <html> <head> <link rel="stylesheet" type="text/css" href="xmlviewer.css" /> <script type="text/javascript" src="xmlviewer.js"></script> </head> <body> <script type="text/javascript"> testxml="<xml><item1>текст1</item1><item2>текст2<item3>текст3</item3></item2></xml>" document.body.appendChild(formExtend(testxml)); </script> </body> </html> |
Цитата:
|
Еще пишут и я тоже согласен, ибо как-то делал сайт целиком на XML-XSL http://stackoverflow.com/questions/9...ic-xml-as-html
|
да, мысли про XSLT были, но я его совсем не знаю и хотелось бы избегнуть.
И как я понимаю это серверная технология. Серверных скриптов я тоже стараюсь избегать. Только статика для простоты и переносимости. |
| Часовой пояс GMT +3, время: 01:17. |