Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Отобразить XML (https://javascript.ru/forum/misc/57071-otobrazit-xml.html)

Palama 17.07.2015 18:16

Отобразить XML
 
Нужно на одной странице отобразить несколько xml в виде структуры как она есть, т.е. с тегами, открывающимися по клику.
Наподобие того как браузер отображает xml-файл.

Пробовал открывать xml-файлы в iframe, но нормально отображает только firefox.

Нужен какой-то способ указать браузеру что во фрейме именно xml,
или же отыскать библиотеку, представляющие данные нужным образом, т.е. с подсветкой тегов и фолдингом

kostyanet 17.07.2015 21:50

Пишут что все должно работать по встроенным стилям.

Цитата:

Current state of existing browser support for XML (1 August 2014):

Current versions of Microsoft Internet Explorer, Firefox, Safari, Chrome, Mozilla, and Opera all appear to support XML with CSS and/or XSLT 1.0 stylesheets. The editor would welcome additional information and corrections.

Palama 17.07.2015 22:06

Ну так оно и работает, если просто открыть 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">&lt;'+elem.childNodes[i].nodeName+'&gt;</div>';
			result += '<span class="tgcontent">';
			result += extractNode(elem.childNodes[i]);
			result += '</span>';
			result += '<div class="tgname ender">&lt;/'+elem.childNodes[i].tagName+'&gt;</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>

kostyanet 17.07.2015 22:12

Цитата:

Сообщение от Palama
А мне нужно много их на одной странице

В десктоп-терминах вам надо открыть несколько вордовых документов на одной странице ворда. Само собой тут либо ембед, либо VBA.

kostyanet 17.07.2015 22:16

Еще пишут и я тоже согласен, ибо как-то делал сайт целиком на XML-XSL http://stackoverflow.com/questions/9...ic-xml-as-html

Palama 17.07.2015 22:24

да, мысли про XSLT были, но я его совсем не знаю и хотелось бы избегнуть.
И как я понимаю это серверная технология.
Серверных скриптов я тоже стараюсь избегать. Только статика для простоты и переносимости.


Часовой пояс GMT +3, время: 14:52.