У меня есть строка, представляющая XML-код без отступов, который я хотел бы распечатать. Например:
<root><node/></root>
должен стать:
<root>
<node/>
</root>
Подсветка синтаксиса не является обязательной. Чтобы решить эту проблему, я сначала преобразовываю XML, чтобы добавить возврат каретки и пробелы, а затем использую предварительный тег для вывода XML. Чтобы добавить новые строки и пробелы, я написал следующую функцию:
function formatXml(xml) {
var formatted = '';
var reg = /(>)(<)(\/*)/g;
xml = xml.replace(reg, '$1\r\n$2$3');
var pad = 0;
jQuery.each(xml.split('\r\n'), function(index, node) {
var indent = 0;
if (node.match( /.+<\/\w[^>]*>$/ )) {
indent = 0;
} else if (node.match( /^<\/\w/ )) {
if (pad != 0) {
pad -= 1;
}
} else if (node.match( /^<\w[^>]*[^\/]>.*$/ )) {
indent = 1;
} else {
indent = 0;
}
var padding = '';
for (var i = 0; i < pad; i++) {
padding += ' ';
}
formatted += padding + node + '\r\n';
pad += indent;
});
return formatted;
}
Затем я вызываю функцию следующим образом:
jQuery('pre.formatted-xml').text(formatXml('<root><node1/></root>'));
Это прекрасно работает для меня, но когда я писал предыдущую функцию, я думал, что должен быть лучший способ. Итак, мой вопрос: знаете ли вы какой-нибудь лучший способ дать XML-строку, чтобы красиво распечатать ее на HTML-странице? Любые JavaScript-фреймворки и / или плагины, которые могут сделать эту работу, приветствуются. Мое единственное требование - это сделать на стороне клиента.
источник
Ответы:
Из текста вопроса у меня складывается впечатление, что ожидается строковый результат , а не результат в формате HTML.
Если это так, самый простой способ добиться этого - обработать XML-документ с помощью преобразования идентификаторов и
<xsl:output indent="yes"/>
инструкции :При применении этого преобразования к предоставленному документу XML:
большинство процессоров XSLT (.NET XslCompiledTransform, Saxon 6.5.4 и Saxon 9.0.0.2, AltovaXML) дают желаемый результат:
источник
Небольшая модификация функции javascript в efnx clckclcks. Я изменил форматирование с пробелов на табуляцию, но самое главное, я позволил тексту остаться в одной строке:
источник
<?xml ... ?>
объявления в начале текста XMLЭто можно сделать с помощью встроенных инструментов javascript, без сторонних библиотек, расширяя ответ @Dimitre Novatchev:
Выходы:
JSFiddle
Обратите внимание, как отмечает @ jat255, красивая печать с
<xsl:output indent="yes"/>
помощью firefox не поддерживается. Кажется, он работает только в браузерах Chrome, Opera и, вероятно, в остальных браузерах на основе webkit.источник
private makeSingleLine(txt: string): string { let s = txt.trim().replace(new RegExp("\r", "g"), "\n"); let angles = ["<", ">"]; let empty = [" ", "\t", "\n"]; while (s.includes(" <") || s.includes("\t<") || s.includes("\n<") || s.includes("> ") || s.includes(">\t") || s.includes(">/n")) { angles.forEach(an => { empty.forEach(em => { s = s.replace(new RegExp(em + an, "g"), an); }); }); } return s.replace(new RegExp("\n", "g"), " "); }
xsl:output
тег, поэтому вы не получите хороший форматирование в любом случае.Personnaly, я использую google-code-prettify с этой функцией:
источник
Нашел этот поток, когда у меня было похожее требование, но я упростил код OP следующим образом:
работает для меня!
источник
Или, если вам просто нужна другая функция js, я модифицировал Darin (очень):
источник
Все приведенные здесь функции javascript не будут работать для документа xml с неопределенными пробелами между конечным тегом «>» и начальным тегом «<». Чтобы их исправить, нужно просто заменить первую строку в функциях
по
источник
как насчет создания узла-заглушки (document.createElement ('div') - или с использованием вашего библиотечного эквивалента), заполнения его строкой xml (через innerHTML) и вызова простой рекурсивной функции для корневого элемента / или элемента-заглушки на случай, если вы нет рута Функция будет вызывать себя для всех дочерних узлов.
Затем вы можете выделить синтаксис по пути, быть уверенным, что разметка правильно сформирована (это делается браузером автоматически при добавлении через innerHTML) и т. Д. Это не будет так много кода и, вероятно, достаточно быстро.
источник
Если вы ищете решение для JavaScript, просто возьмите код из инструмента Pretty Diff по адресу http://prettydiff.com/?m=beautify.
Вы также можете отправлять файлы в инструмент с помощью параметра s, например: http://prettydiff.com/?m=beautify&s=https://stackoverflow.com/
источник
источник
источник
XMLSpectrum форматирует XML, поддерживает отступы атрибутов, а также делает подсветку синтаксиса для XML и любых встроенных выражений XPath:
XMLSpectrum - это проект с открытым исходным кодом, закодированный в XSLT 2.0 - так что вы можете запустить эту сторону сервера с таким процессором, как Saxon-HE (рекомендуется) или со стороны клиента, используя Saxon-CE.
XMLSpectrum еще не оптимизирован для работы в браузере, поэтому рекомендуется запускать его на стороне сервера.
источник
Используйте приведенный выше метод для красивой печати, а затем добавьте его в любой div с помощью метода jquery text () . например, идентификатор div
xmldiv
затем использовать:$("#xmldiv").text(formatXml(youXmlString));
источник
вот еще одна функция для форматирования XML
источник
Вы можете получить довольно отформатированный XML с помощью XML-украшения
отступ : шаблон отступа, как пробелы
useSelfClosingElement : true => использовать самозакрывающийся элемент, когда пустой элемент.
JSFiddle
Original (Перед)
Приукрашена (После)
источник
источник
В библиотеке Xml-to-json есть метод.
formatXml(xml).
Я поддерживаю проект.источник