J'ai une chaîne qui représente un XML non indenté que je voudrais joliment imprimer. Par exemple:
<root><node/></root>
devrait devenir:
<root>
<node/>
</root>
La mise en évidence de la syntaxe n'est pas obligatoire. Pour résoudre le problème, je transforme d'abord le XML pour ajouter des retours chariot et des espaces blancs, puis j'utilise une balise pré pour générer le XML. Pour ajouter de nouvelles lignes et des espaces blancs, j'ai écrit la fonction suivante:
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;
}
J'appelle ensuite la fonction comme ceci:
jQuery('pre.formatted-xml').text(formatXml('<root><node1/></root>'));
Cela fonctionne parfaitement bien pour moi, mais pendant que j'écrivais la fonction précédente, je pensais qu'il devait y avoir un meilleur moyen. Ma question est donc de savoir si vous connaissez un meilleur moyen, avec une chaîne XML, de l'imprimer dans une page html? Tous les frameworks et / ou plugins javascript qui pourraient faire le travail sont les bienvenus. Ma seule exigence est que cela soit fait du côté client.
la source
Réponses:
D'après le texte de la question, j'ai l'impression qu'un résultat de chaîne est attendu , par opposition à un résultat au format HTML.
Si tel est le cas, le moyen le plus simple d'y parvenir est de traiter le document XML avec la transformation d'identité et avec une
<xsl:output indent="yes"/>
instruction :Lors de l'application de cette transformation sur le document XML fourni:
la plupart des processeurs XSLT (.NET XslCompiledTransform, Saxon 6.5.4 et Saxon 9.0.0.2, AltovaXML) produisent le résultat souhaité:
la source
Légère modification de la fonction javascript de efnx clckclcks. J'ai changé la mise en forme d'espaces en tabulation, mais surtout, j'ai autorisé le texte à rester sur une ligne:
la source
<?xml ... ?>
déclaration facultative au début du texte XMLCela peut être fait en utilisant des outils javascript natifs, sans bibliothèques tierces, en étendant la réponse de @Dimitre Novatchev:
Les sorties:
JSFiddle
Notez, comme indiqué par @ jat255, une jolie impression avec
<xsl:output indent="yes"/>
n'est pas prise en charge par Firefox. Cela ne semble fonctionner que dans Chrome, Opera et probablement les autres navigateurs basés sur le Webkit.la source
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
balise, donc vous n'obtiendrez pas le bon formatage de toute façon.Personnellement, j'utilise google-code-prettify avec cette fonction:
la source
J'ai trouvé ce fil lorsque j'avais une exigence similaire, mais j'ai simplifié le code d'OP comme suit:
travaille pour moi!
la source
Ou si vous souhaitez simplement qu'une autre fonction js le fasse, j'ai beaucoup modifié celle de Darin:
la source
Toutes les fonctions javascript données ici ne fonctionneront pas pour un document xml comportant des espaces non spécifiés entre la balise de fin '>' et la balise de début '<'. Pour les corriger, il vous suffit de remplacer la première ligne dans les fonctions
par
la source
que diriez-vous de créer un nœud de stub (document.createElement ('div') - ou en utilisant votre équivalent de bibliothèque), de le remplir avec la chaîne xml (via innerHTML) et d'appeler une fonction récursive simple pour l'élément racine / ou l'élément de stub au cas où vous n'ont pas de racine. La fonction s'appellerait pour tous les nœuds enfants.
Vous pouvez ensuite mettre en évidence la syntaxe en cours de route, être certain que le balisage est bien formé (fait automatiquement par le navigateur lors de l'ajout via innerHTML) etc. Ce ne serait pas autant de code et probablement assez rapide.
la source
Si vous recherchez une solution JavaScript, prenez simplement le code de l'outil Pretty Diff à l' adresse http://prettydiff.com/?m=beautify
Vous pouvez également envoyer des fichiers à l'outil en utilisant le paramètre s, tel que: http://prettydiff.com/?m=beautify&s=https://stackoverflow.com/
la source
la source
la source
XMLSpectrum formate XML, prend en charge l'indentation d'attribut et met également en évidence la syntaxe pour XML et toutes les expressions XPath intégrées:
XMLSpectrum est un projet open source, codé en XSLT 2.0 - vous pouvez donc exécuter ce côté serveur avec un processeur tel que Saxon-HE (recommandé) ou côté client en utilisant Saxon-CE.
XMLSpectrum n'est pas encore optimisé pour s'exécuter dans le navigateur - d'où la recommandation d'exécuter ce côté serveur.
la source
Utilisez la méthode ci-dessus pour une jolie impression, puis ajoutez-la dans n'importe quel div en utilisant la méthode jquery text () . par exemple id de div est
xmldiv
alors utiliser:$("#xmldiv").text(formatXml(youXmlString));
la source
voici une autre fonction pour formater xml
la source
Vous pouvez obtenir du xml assez formaté avec xml-beautify
retrait : motif de retrait comme des espaces blancs
useSelfClosingElement : true => utiliser un élément à fermeture automatique lorsque l'élément vide.
JSFiddle
Original (avant)
Embellie (après)
la source
la source
La bibliothèque Xml-to-json a la méthode
formatXml(xml).
Je suis le mainteneur du projet.la source