Eu tenho uma string que representa um XML não recuado que eu gostaria de imprimir. Por exemplo:
<root><node/></root>
Deve se tornar:
<root>
<node/>
</root>
O destaque da sintaxe não é um requisito. Para resolver o problema, primeiro transformo o XML para adicionar retornos de carro e espaços em branco e, em seguida, uso uma tag pré para gerar o XML. Para adicionar novas linhas e espaços em branco, escrevi a seguinte função:
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;
}
Eu então chamo a função assim:
jQuery('pre.formatted-xml').text(formatXml('<root><node1/></root>'));
Isso funciona perfeitamente bem para mim, mas enquanto escrevia a função anterior, pensei que deveria haver uma maneira melhor. Então, minha pergunta é: você conhece alguma maneira melhor de fornecer uma string XML para imprimi-la em uma página html? Quaisquer estruturas javascript e / ou plug-ins que possam fazer o trabalho são bem-vindos. Meu único requisito é que isso seja feito no lado do cliente.
fonte
Respostas:
No texto da pergunta, tenho a impressão de que um resultado de string é esperado , em oposição a um resultado formatado em HTML.
Nesse caso, a maneira mais simples de conseguir isso é processar o documento XML com a transformação de identidade e com uma
<xsl:output indent="yes"/>
instrução :Ao aplicar esta transformação no documento XML fornecido:
a maioria dos processadores XSLT (.NET XslCompiledTransform, Saxon 6.5.4 e Saxon 9.0.0.2, AltovaXML) produz o resultado desejado:
fonte
Ligeira modificação da função javascript do efnx clckclcks. Alterei a formatação de espaços para tabulação, mas o mais importante era permitir que o texto permanecesse em uma linha:
fonte
<?xml ... ?>
declaração no início do texto XMLIsso pode ser feito usando ferramentas javascript nativas, sem bibliotecas de terceiros, estendendo a resposta do @Dimitre Novatchev:
Saídas:
JSFiddle
Observe, como apontado por @ jat255, a bonita impressão com
<xsl:output indent="yes"/>
não é suportada pelo firefox. Parece apenas funcionar no chrome, opera e provavelmente nos demais navegadores baseados em webkit.fonte
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
tag, portanto você não terá o melhor formatação de qualquer maneira.Pessoalmente, eu uso o google-code-prettify com esta função:
fonte
Encontrei esse segmento quando eu tinha um requisito semelhante, mas simplifiquei o código do OP da seguinte maneira:
funciona para mim!
fonte
Ou se você gostaria que outra função js fizesse isso, eu modifiquei o de Darin (muito):
fonte
Todas as funções javascript fornecidas aqui não funcionarão para um documento xml com espaços em branco não especificados entre a marca final '>' e a marca inicial '<'. Para corrigi-los, você só precisa substituir a primeira linha nas funções
de
fonte
que tal criar um nó de stub (document.createElement ('div') - ou usar o equivalente da sua biblioteca), preenchê-lo com a string xml (via innerHTML) e chamar uma função recursiva simples para o elemento raiz / ou o elemento stub, caso você não tem raiz. A função se chamaria para todos os nós filhos.
Você pode então destacar a sintaxe ao longo do caminho, ter certeza de que a marcação está bem formada (feita automaticamente pelo navegador ao anexar via innerHTML) etc. Não seria tanto código e provavelmente rápido o suficiente.
fonte
Se você está procurando uma solução JavaScript, basta pegar o código da ferramenta Pretty Diff em http://prettydiff.com/?m=beautify
Você também pode enviar arquivos para a ferramenta usando o parâmetro s, como: http://prettydiff.com/?m=beautify&s=https://stackoverflow.com/
fonte
fonte
fonte
XMLSpectrum formata XML, suporta recuo de atributo e também realça a sintaxe para XML e quaisquer expressões XPath incorporadas:
O XMLSpectrum é um projeto de código aberto, codificado em XSLT 2.0 - para que você possa executar esse servidor com um processador como o Saxon-HE (recomendado) ou o cliente usando o Saxon-CE.
O XMLSpectrum ainda não está otimizado para execução no navegador - daí a recomendação de executar esse servidor.
fonte
Use o método acima para obter uma impressão bonita e adicione-o em qualquer div usando o método jquery text () . por exemplo, id de div é
xmldiv
usado:$("#xmldiv").text(formatXml(youXmlString));
fonte
aqui está outra função para formatar xml
fonte
Você pode obter um xml bastante formatado com xml-beautify
recuo : padrão de recuo como espaços em branco
useSelfClosingElement : true => use o elemento de fechamento automático quando o elemento estiver vazio.
JSFiddle
Original (Antes)
Embelezado (Depois)
fonte
fonte
A biblioteca XML-para-json tem o método
formatXml(xml).
Eu sou o mantenedor do projeto.fonte