Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.07.2015, 18:16
Интересующийся
Отправить личное сообщение для Palama Посмотреть профиль Найти все сообщения от Palama
 
Регистрация: 24.06.2015
Сообщений: 16

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

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

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

Последний раз редактировалось Palama, 17.07.2015 в 18:20.
Ответить с цитированием
  #2 (permalink)  
Старый 17.07.2015, 21:50
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

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

Цитата:
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.
Ответить с цитированием
  #3 (permalink)  
Старый 17.07.2015, 22:06
Интересующийся
Отправить личное сообщение для Palama Посмотреть профиль Найти все сообщения от Palama
 
Регистрация: 24.06.2015
Сообщений: 16

Ну так оно и работает, если просто открыть 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>
Ответить с цитированием
  #4 (permalink)  
Старый 17.07.2015, 22:12
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Сообщение от Palama
А мне нужно много их на одной странице
В десктоп-терминах вам надо открыть несколько вордовых документов на одной странице ворда. Само собой тут либо ембед, либо VBA.
Ответить с цитированием
  #5 (permalink)  
Старый 17.07.2015, 22:16
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Еще пишут и я тоже согласен, ибо как-то делал сайт целиком на XML-XSL http://stackoverflow.com/questions/9...ic-xml-as-html
Ответить с цитированием
  #6 (permalink)  
Старый 17.07.2015, 22:24
Интересующийся
Отправить личное сообщение для Palama Посмотреть профиль Найти все сообщения от Palama
 
Регистрация: 24.06.2015
Сообщений: 16

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

Последний раз редактировалось Palama, 17.07.2015 в 22:26.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в XML файл вставить другой XML файл ? MSDeveloper (X)HTML/CSS 1 02.09.2014 22:02
Найти XML-парсер / редактор XML с сохранением пользовательского форматирования Kri0-Gen Библиотеки/Тулкиты/Фреймворки 0 20.06.2014 23:31
Работа с xml Phenix Общие вопросы Javascript 3 03.04.2013 12:16
Парсинг из xml Vasy Общие вопросы Javascript 19 13.03.2013 17:15
Как удалить из памяти весь XML документ? EisBerg Events/DOM/Window 1 03.04.2010 14:45