Mam ciąg reprezentujący XML bez wcięć, który chciałbym dobrze wydrukować. Na przykład:
<root><node/></root>
powinno stać się:
<root>
<node/>
</root>
Podświetlanie składni nie jest wymagane. Aby rozwiązać ten problem, najpierw przekształcam XML, dodając powrót karetki i spacje, a następnie używam znacznika wstępnego, aby wyprowadzić XML. Aby dodać nowe linie i spacje, napisałem następującą funkcję:
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;
}
Następnie wywołuję tę funkcję w ten sposób:
jQuery('pre.formatted-xml').text(formatXml('<root><node1/></root>'));
U mnie to działa doskonale, ale kiedy pisałem poprzednią funkcję, pomyślałem, że musi być lepszy sposób. Więc moje pytanie brzmi: czy znasz lepszy sposób na ładnie wydrukowany ciąg XML na stronie html? Wszelkie frameworki i / lub wtyczki javascript, które mogłyby wykonać to zadanie, są mile widziane. Moim jedynym wymaganiem jest to, aby zostało to zrobione po stronie klienta.
źródło
Odpowiedzi:
Z treści pytania odnoszę wrażenie, że oczekiwany jest wynik typu string , a nie wynik w formacie HTML.
Jeśli tak jest, najprostszym sposobem osiągnięcia tego jest przetworzenie dokumentu XML z transformacją tożsamości i
<xsl:output indent="yes"/>
instrukcją :W przypadku stosowania tej transformacji na dostarczonym dokumencie XML:
większość procesorów XSLT (.NET XslCompiledTransform, Saxon 6.5.4 i Saxon 9.0.0.2, AltovaXML) daje oczekiwany wynik:
źródło
Nieznaczna modyfikacja funkcji javascript efnx clckclcks. Zmieniłem formatowanie ze spacji na tabulator, ale co najważniejsze pozwoliłem, aby tekst pozostał w jednej linii:
źródło
<?xml ... ?>
deklarację na początku tekstu XMLMożna to zrobić za pomocą natywnych narzędzi javascript, bez bibliotek innych firm, rozszerzając odpowiedź @Dimitre Novatchev:
Wyjścia:
JSFiddle
Uwaga, jak wskazał @ jat255, ładne drukowanie w programie
<xsl:output indent="yes"/>
Firefox nie jest obsługiwane. Wygląda na to, że działa tylko w Chrome, Opera i prawdopodobnie w pozostałych przeglądarkach opartych na webkitach.źródło
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
tagu, więc nie dostaniesz ładnego formatowanie mimo wszystko.Osobiście używam google-code-prettify z tą funkcją:
źródło
Znalazłem ten wątek, gdy miałem podobne wymaganie, ale uprościłem kod OP w następujący sposób:
pracuje dla mnie!
źródło
Lub jeśli chciałbyś po prostu wykonać inną funkcję js, zmodyfikowałem Darin's (bardzo):
źródło
Wszystkie podane tutaj funkcje javascript nie będą działać dla dokumentu xml, który ma nieokreślone białe spacje między znacznikiem końcowym „>” a znacznikiem początkowym „<”. Aby je naprawić, wystarczy zamienić pierwszą linię w funkcjach
przez
źródło
co z utworzeniem węzła pośredniczącego (document.createElement ('div') - lub użycie odpowiednika w bibliotece), wypełnieniem go ciągiem xml (przez innerHTML) i wywołaniem prostej funkcji rekurencyjnej dla elementu głównego / lub elementu pośredniczącego na wypadek, gdybyś nie mieć korzenia. Funkcja wywołałaby samą siebie dla wszystkich węzłów potomnych.
Następnie możesz po drodze wyróżnić składnię, upewnić się, że znaczniki są dobrze sformułowane (robione automatycznie przez przeglądarkę podczas dołączania przez innerHTML) itd. Nie byłoby to dużo kodu i prawdopodobnie wystarczająco szybkie.
źródło
Jeśli szukasz rozwiązania JavaScript, po prostu pobierz kod z narzędzia Pretty Diff pod adresem http://prettydiff.com/?m=beautify
Możesz również wysłać pliki do narzędzia za pomocą parametru s, na przykład: http://prettydiff.com/?m=beautify&s=https://stackoverflow.com/
źródło
źródło
źródło
XMLSpectrum formatuje XML, obsługuje wcięcia atrybutów, a także wyróżnia składnię dla XML i wszelkich osadzonych wyrażeń XPath:
XMLSpectrum to projekt open source, zakodowany w XSLT 2.0 - możesz więc uruchomić tę stronę serwera z procesorem, takim jak Saxon-HE (zalecane) lub po stronie klienta, używając Saxon-CE.
XMLSpectrum nie jest jeszcze zoptymalizowany do działania w przeglądarce - stąd zalecenie uruchamiania po stronie serwera.
źródło
Użyj powyższej metody, aby uzyskać ładny wydruk, a następnie dodaj ją do dowolnego elementu div za pomocą metody jquery text () . na przykład id div jest
xmldiv
wtedy używany:$("#xmldiv").text(formatXml(youXmlString));
źródło
tutaj jest kolejna funkcja do formatowania xml
źródło
Możesz uzyskać ładnie sformatowany plik XML za pomocą xml-beautify
indent : wzór wcięcia, taki jak białe spacje
useSelfClosingElement : true => użyj elementu samozamykającego, gdy element jest pusty.
JSFiddle
Oryginał (przed)
Upiększony (po)
źródło
źródło
Biblioteka XML-to-json ma metodę
formatXml(xml).
Jestem opiekunem projektu.źródło