Tengo una cadena que representa un XML sin sangría que me gustaría imprimir bonita. Por ejemplo:
<root><node/></root>
debe convertirse:
<root>
<node/>
</root>
El resaltado de sintaxis no es un requisito. Para abordar el problema, primero transformo el XML para agregar retornos de carro y espacios en blanco y luego uso una etiqueta previa para generar el XML. Para agregar nuevas líneas y espacios en blanco, escribí la siguiente función:
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;
}
Luego llamo a la función así:
jQuery('pre.formatted-xml').text(formatXml('<root><node1/></root>'));
Esto funciona perfectamente bien para mí, pero mientras escribía la función anterior, pensé que debía haber una mejor manera. Entonces, mi pregunta es ¿conoce alguna mejor manera dada una cadena XML para imprimirla bonita en una página html? Todos los marcos y / o complementos de JavaScript que puedan hacer el trabajo son bienvenidos. Mi único requisito es que esto se haga en el lado del cliente.
fuente
Respuestas:
Del texto de la pregunta me da la impresión de que se espera un resultado de cadena , en lugar de un resultado con formato HTML.
Si es así, la forma más sencilla de lograrlo es procesar el documento XML con la transformación de identidad y con una
<xsl:output indent="yes"/>
instrucción :Al aplicar esta transformación en el documento XML proporcionado:
La mayoría de los procesadores XSLT (.NET XslCompiledTransform, Saxon 6.5.4 y Saxon 9.0.0.2, AltovaXML) producen el resultado deseado:
fuente
Ligera modificación de la función javascript de efnx clckclcks. Cambié el formato de espacios a tabulación, pero lo más importante es que permití que el texto permaneciera en una línea:
fuente
<?xml ... ?>
declaración opcional al comienzo del texto XMLEsto se puede hacer usando herramientas javascript nativas, sin bibliotecas de terceros, extendiendo la respuesta de @Dimitre Novatchev:
Salidas:
JSFiddle
Tenga en cuenta que, como señaló @ jat255,
<xsl:output indent="yes"/>
firefox no admite la impresión bonita con . Parece que solo funciona en Chrome, Opera y probablemente el resto de navegadores basados en webkit.fuente
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
etiqueta, por lo que no obtendrá la buena formateo de todos modos.Personalmente, uso google-code-prettify con esta función:
fuente
Encontré este hilo cuando tenía un requisito similar pero simplifiqué el código de OP de la siguiente manera:
¡funciona para mi!
fuente
O si simplemente desea que otra función js lo haga, he modificado Darin (mucho):
fuente
Todas las funciones de JavaScript que se proporcionan aquí no funcionarán para un documento xml que tenga espacios en blanco no especificados entre la etiqueta final '>' y la etiqueta de inicio '<'. Para solucionarlos, solo necesita reemplazar la primera línea en las funciones
por
fuente
¿qué pasa con la creación de un nodo auxiliar (document.createElement ('div') - o usando el equivalente de su biblioteca), llenándolo con la cadena xml (a través de innerHTML) y llamando a la función recursiva simple para el elemento raíz / o el elemento auxiliar en caso de que No tengo una raíz. La función se llamaría a sí misma para todos los nodos secundarios.
Luego, podría resaltar la sintaxis en el camino, asegurarse de que el marcado esté bien formado (hecho automáticamente por el navegador cuando se agrega a través de innerHTML), etc. No sería tanto código y probablemente lo suficientemente rápido.
fuente
Si está buscando una solución de JavaScript, simplemente tome el código de la herramienta Pretty Diff en http://prettydiff.com/?m=beautify
También puede enviar archivos a la herramienta utilizando el parámetro s, como: http://prettydiff.com/?m=beautify&s=https://stackoverflow.com/
fuente
fuente
fuente
XMLSpectrum formatea XML, admite sangría de atributos y también resalta la sintaxis para XML y cualquier expresión XPath incorporada:
XMLSpectrum es un proyecto de código abierto, codificado en XSLT 2.0, por lo que puede ejecutar este lado del servidor con un procesador como Saxon-HE (recomendado) o del lado del cliente utilizando Saxon-CE.
XMLSpectrum aún no está optimizado para ejecutarse en el navegador, de ahí la recomendación de ejecutar este lado del servidor.
fuente
Use el método anterior para una impresión bonita y luego agregue esto en cualquier div utilizando el método jquery text () . por ejemplo, id de div es
xmldiv
usar:$("#xmldiv").text(formatXml(youXmlString));
fuente
Aquí hay otra función para formatear xml
fuente
Puede obtener xml bastante formateado con xml-beautify
sangría : sangría patrón como espacios en blanco
useSelfClosingElement : true => usa el elemento de cierre automático cuando está vacío.
JSFiddle
Original (antes)
Embellecido (después)
fuente
fuente
La biblioteca Xml-to-json tiene un método
formatXml(xml).
. Soy el encargado de mantener el proyecto.fuente